前端模块化标准CommonJS,ES6 Module

243 阅读3分钟

CommonJS

目前,只有node环境才支持CommonJS模块化标准,所以要使用CommonJS,必须安装Node

具体规范如下: 1、一个JS文件即为一个模块 2、如果一个模块需要暴露一些数据或功能为其他模块使用,需要使用 module.exports=xxx,该过程称之为模块的导出 3、如果一个模块需要使用另一个模块导出的内容,需要使用代码 require("模块路径") # 模块路径必须以./或../开头 # 如果文件的后缀名为.js,可以省略后缀名 # require函数返回的是模块导出的内容 4、模块中的所有全局代码产生的变量、函数、均不会对全局造成任何污染,仅在模块内使用 5、模块具有缓存,第一次导入模块会缓存模块的导出,之后在导入同一个模块无论多少次,都将直接使用第一次缓存的结果(为了避免模块重复执行)

原理: 可以想象一下,在node环境中,它把你的每一个JS文件都是放到一个函数环境里执行的,类似下面:

function(module) {
    module.exports = {};
    var exports = module.exports;
    //你的模块代码
    return module.exports;
}

当调用require('路径')时,相当于执行上面的函数
例题:
exports.a=1;
exports.b=1;

最后得到 {a:1,b:1}

exports.a=1;
exports.b=1;
module.exports = {}
最后得到{}

## ES6 Module  官方的模块化标准
<script src="入口文件" type="module">

具体规范如下:
导出,分为基本导出和默认导出
导出:{
    a:1,
    b:1,
    c:2,
    default:345//默认导出
}
# 基本导出
正确
export var a=1 //基本导出 {a:1}
export var b = function() {} //基本导出{b:function}
export function method(){} //基本导出{method:function}
var c = 3;
export { c } //基本导出 {c:3}
export { c as temp} //基本导出{temp:3}

错误
var b = 2;
export b //相当于导出值
export b=2 //相当于导出值,因为表达式最终的结果是一个值

所以
基本导出必须要声明,并且有名字

# 默认导出,名字都是default
export default 3 //默认导出defalult = 3
export default function () {} //默认导出 default=function(){}
var c = 3;
export {c as default} //默认导出 default=3
var a=1,b=2,c=3;
export {a,b,c as default}// 基本导出 a=1,b=2,默认导出 ddefault=3

导入
import { a, b } from "模块路径" //导入属性 a,b 放到 a,b变量中
import { a as temp1, b as temp2 } from "模块路径" //导入a,b属性,放到temp1,temp2变量中
import { default as a } from "模块路径" //导入属性default,放入变量a中
import { default as a, b } from "模块路径" //导入属性default导入变量a中,b放入变量b中
import c from "模块路径" //相当于导入 default属性,放入c中
import c,{a,b} from "模块路径" //相当于导入default属性放到c中,属性a,b放到变量a,b中
import * as obj from "模块路径" //将模块对象放入变量obj中
import "模块路径" //不导入任何内容,仅执行一次模块

导入模块时,注意一下细节 1、es6 module 采用依赖预加载模式,所有模块导入代码均会提升到代码顶部 3、导入的内容是放置到常量中的,不可更改 4、es6 module 采用了缓存,保证每个模块仅加载一次