js模块导入/导出大全
2024-09-01 18:41:36
说明
- module.exports与exports是CommonJS的规范
- export与export default是es6规范
- require 是 AMD规范引入方式
- import是es6的一个语法标准
module.exports与exports
- module变量代表当前模块。这个变量是一个对象,module对象会创建一个叫exports的属性,这个属性的默认值是一个空的对象;
module.exports.aa="我是aa";
module.exports.bb="我是bb";
//上边这段代码就相当于一个对象
{
"aa":"我是aa",
"bb":"我是bb",
}
- 引用方法
var req=require("./app.js");
req.aa //这个值是 "我是aa"
- 而exports只是module.exports的一个引用,可以理解为:
var exports = module.exports;
- 但是这个两个还是有一定区别的,因为exports只是module.exports的一个引用,所以module.exports可以导出一个匿名函数,而exports不可以。因为这会切断和modeule.exports的联系。
- 如果不是很理解的话,下面举例说明(需要先明白引用数据类型和基础数据类型):
var m={}
m.e1={}
var e2=m.e1;
e2.aa=1
console.log(m.e1.aa)//打印1
e2=function(){
return 123;
}
console.log(m.e1)//打印{aa:1}
console.log(e2)//打印 ƒ (){return 123;}
//也就是说如果给exports导出匿名函数,就会重写exports引用地址指向
- 也就是说也不能这样写exports= { name,say },它同样会改变exports地址指向
!
export与export default
二者的区别有以下几点:
- export default在一个模块中只能有一个,当然也可以没有。export在一个模块中可以有多个。
- export default的对象、变量、函数、类,可以没有名字。export的必须有名字。
- export default对应的import和export有所区别
1.export写法
var name="我是电脑";
var say=function(){
console.log("我可以干很多事");
}
export {name,say};
//也可以直接一个一个的export但是必须得有名字
export const a=1;
export function data(){
return data;
}
//其他页面引入时必须这样
import {name,say} from "./app.js"
2.export default
//可以没有函数名字
export default function(){
return data;
}
//这里export不能这样导出
export default const a=12;//报错
//应该这样导出
const a=12;
export default a
//其他页面引入时必须这样
import data from "./app.js"
import和require
调用时间
- require是运行时调用,所以require理论上可以运用在代码的任何地方
- import是编译时调用,所以必须放在文件开头
本质
- require是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量
- import是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require
对比
require/exports
- 遵循 CommonJS/AMD,只能在运行时确定模块的依赖关系及输入/输出的变量,无法进行静态优化
- 用法只有以下三种简单的写法:
const fs = require('fs')
exports.fs = fs
module.exports = fs
import/export
- 遵循 ES6 规范,支持编译时静态分析,便于JS引入宏和类型检验。动态绑定。
- 写法就比较多种多样:
import fs from 'fs'
import {default as fs} from 'fs'
import * as fs from 'fs'
import {readFile} from 'fs'
import {readFile as read} from 'fs'
import fs, {readFile} from 'fs'
export default fs
export const fs
export function readFile
export {readFile, read}
export * from 'fs'
注意
- 通过require引入基础数据类型时,属于复制该变量。
- 通过require引入复杂数据类型时,数据浅拷贝该对象。
- 出现模块之间的循环引用时,会输出已经执行的模块,而未执行的模块不输出(比较复杂)
- CommonJS模块默认export的是一个对象,即使导出的是基础数据类型
最新文章
- inline-block和float
- linux 下UGet闪退问题
- Python Day10
- 简易购物车 --day2
- jquery判断页面滚动条(scroll)是上滚还是下滚,且是否滚动到头部或者底部
- 基于微软EnterpriseLib的框架(一)
- 解决NoSuchMethodError with Spring MutableValues异常问题
- win7 下面使用任务计划程序执行php脚步
- JavaScript知识(二)
- Java运行时内存
- JavaSE(一) IO类层次关系和各种IO流的用法总结
- 代码管理必备-----git使用上传码云
- 【问题解决方案】Git bash进入多层子目录问题(通配符问题留坑)
- linux网络流量实时监控工具之nload
- Python 解析XML实例(xml.sax)
- 标准IO缓冲机制
- Linux 定时任务crontab_014
- Web编辑器的使用
- LeetCode--069--x的平方根
- 课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 2、10个测验题
热门文章
- egg 框架自动创建数据库表结构
- Educational Codeforces Round 71 (Rated for Div. 2)E. XOR Guessing
- SSH隧道的使用
- 关于数论分块里r=sum/(sum/l)的证明!
- Linux下rpm仓库搭建
- Linux跨网段通信小实验
- Zabbix-(一) 安装与部署
- Asp.net Core 系列之--4.事务、日志及错误处理
- C++中对封装的语法支持——this指针
- nyoj 16-矩形嵌套(贪心 + 动态规划DP)