9-js模块化
前端模块化分几种:CommonJS、ES6、AMD、CMD、UMD
BTW,组件库打包比如antd 打包出来的文件目录比如lib es dist 分别是common.js esmodule umd 模块
CommonJS CommonJS 采用的是运行时同步加载,模块输出的是一个值的拷贝。 针对为什么CommonJS是运行时同步加载:阮一峰老师有着很好的解释
是因为 CommonJS 加载的是一个对象(即
module.exports
属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成
主要API
module对象 Node内部提供一个
Module
构建函数。所有模块都是Module
的实例 每个模块内部,都有一个module
对象,代表当前模块。它有以下属性module.id
模块的识别符,通常是带有绝对路径的模块文件名。module.filename
模块的文件名,带有绝对路径。module.loaded
返回一个布尔值,表示模块是否已经完成加载。module.parent
返回一个对象,表示调用该模块的模块。module.children
返回一个数组,表示该模块要用到的其他模块。module.exports
表示模块对外输出的值,其他文件加载该模块,实际上就是读取module.exports
变量。
exports变量 为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令
var exports = module.exports
。很明显这里会涉及到对象的引用问题。所以实际开发中尽量避免使用exports变量require 引用module.exports导出的整个变量
ES6 ES6模块化采用的是编译时输出接口,提供的是值的引用 主要API:
export
命令用于规定模块的对外接口,export可以定义再文件的任何一个位置中 例如:export var a = 2
此时 我们可以使用import
命令进行接收 形如:import {a as b} form '路径'
。其中大括号中的变量名必须与导出的名字相一致,as 后是可以使用别名。 也可以用export default b = 3
来导出默认的一个值,这样使用import
命令时就无须记住变量名,形如import a from '路径'
AMD AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。由于是异步 所以更适合浏览器环境,他比较强调的是依赖前置 语法为:
require([module], callback);define([module],callback)
主要实现库为require.jsCMD 推崇依赖就近,只有真正需要才加载,只有使用的时候才定义依赖。没什么用了解即可
UMD 推出时间大约在 2013 年。UMD 主要是解决跨平台模块化方案的问题,它合并了 CommonJS 和 AMD 规范,能够兼容各种情况的环境,同时运行在客户端和服务器端,因此被称为是通用的模块定义。当使用 Rollup/Webpack 之类的打包器时,UMD 通常用作备用模块
注:所以说single-spa 子模块可以设置为amd也是可以的。核心是要的导入加载。
参考文章 阮一峰-ECMAScript 6 入门 CommonJS规范 前端模块化:CommonJS,AMD,CMD,ES6
Last updated
Was this helpful?