-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[JS] [2021-01-19 更新] 请列出目前主流的 Javascript 模块化实现的技术有哪些? 说出它们的区别? #14
Comments
主要技术有:
一、CommonJS CommonJS的出发点: JS没有完善的模块系统,标准库较少,缺少包管理工具。伴随着NodeJS的兴起,能让JS在任何地方运行,特别是服务端,也达到了具备开发大型项目的能力,所以CommonJS营运而生。
CommonJS规范
注意
二、ES6模块化 ES6在语言标准的层面上,实现了模块功能,而且实现得相当简单,旨在成为浏览器和服务器通用的模块解决方案。 其模块功能主要由两个命令构成: 其实ES6还提供了 ES6的模块不是对象, export export可以导出的是一个对象中包含的多个属性、方法。 export default只能导出一个可以不具名的函数。我们可以通过import进行引用。同时,我们也可以直接使用require使用,原因是webpack起了server相关。 import
三、AMD Asynchronous Module Defnition,异步加载模块。它是一个在浏览器端模块化开发的规范,不是原生js的规范,使用AMD规范进行页面开发需要用到对应的函数库,RequireJS。 AMD规范采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。 使用require.js 实现AMD 规范的模块化: 用require. config()指定引用路径等,用define()定义模块,用require()加载模块。 // 定义模块
define('moduleName', ['a', 'b'] , function(ma, mb){
return someExpor tValue;
})
// 引入模块
require( ['a','b'], function(ma ,mb){
/ *code*/
}) RequireJS主要解决的问题
语法
四、CMD CMD是另一种js模块化方案,它与AMD很类似,不同点在 于: AMD推崇依赖前置、提前执行,CMD推崇依赖就近、延迟执行。此规范其实是在sea.js推广过程中产生的。 因为CMD推崇-一个文件一个模块,所以经常就用文件名作 为模块id; CMD推 崇依赖就近,所以-般不在defne的参 数中写依赖,而是在factory中写 。 factory有三个参数:
五、UMD 通用规范 一种整合了CommonJS和AMD规范的方法,希望能解决跨平台模块方案。
(function (window, factory) {
if (typeof exports === 'object') {
module.exports = factory();
} else if (typeof define === 'function' && define.amd) {
define(factory);
} else {
window.eventUtil = factory();
}
})(this, function () {
//module ...
}); 六、总结 commonjs是同步加载的。主要是在nodejs也就是服务端 应用的模块化机制,通过 AMD是异步加载的。主要应用在浏览器环境下。requireJS 是遵循AMD规范的模块化工具。他是通过 ES6的模块化加载时通过 ES6的模块的运行机制与common不一样,js引擎对脚本静态分析的时候,遇到模块加载指令后会生成一个只读引用,等到脚本真正执行的时候才会通过弓|用去模块中获取值,在引用到执行的过程中模块中的值发生了变化,导入的这里也会跟着变,ES6模块是动态引用,并不会缓存值,模块里总是绑定其所在的模块。 |
No description provided.
The text was updated successfully, but these errors were encountered: