We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
require.js:
// main.js // 依赖必须一开始就写好 require(["./add", "./square"], function(addModule, squareModule) { console.log(addModule.add(1, 1)); console.log(squareModule.square(3)); }); // square.js define(["./multiply"], function(multiplyModule) { console.log("加载了 square 模块"); return { square: function(num) { return multiplyModule.multiply(num, num); } }; });
sea.js 例子中的 main.js
define(function(require, exports, module) { var addModule = require("./add"); console.log(addModule.add(1, 1)); // 依赖可以就近书写 var squareModule = require("./square"); console.log(squareModule.square(3)); }); // square.js define(function(require, exports, module) { console.log("加载了 square 模块"); var multiplyModule = require("./multiply"); module.exports = { square: function(num) { return multiplyModule.multiply(num, num); } }; });
// require.js 加载了 add 模块 加载了 multiply 模块 加载了 square 模块 2 9 // sea.js 加载了 add 模块 2 加载了 square 模块 加载了 multiply 模块 9
AMD 是将需要使用的模块先加载完再执行代码,而 CMD 是在 require 的时候才去加载模块文件,加载完再接着执行。
AMD 和 CMD 都是用于浏览器端的模块规范,而在服务器端比如 node,采用的则是 CommonJS 规范。
跟 sea.js 的执行结果一致,也是在 require 的时候才去加载模块文件,加载完再接着执行。
导出模块的方式:
var add = function(x, y) { return x + y; }; module.exports.add = add;
引入模块的方式:
var add = require("./add.js");
引用阮一峰老师的《JavaScript 标准参考教程(alpha)》:
CommonJS 规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。
AMD 规范则是非同步加载模块,允许指定回调函数。
由于 Node.js 主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以 CommonJS 规范比较适用。
但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用 AMD 规范。
// profile.js var firstName = "Michael"; var lastName = "Jackson"; var year = 1958; export { firstName, lastName, year };
import { firstName, lastName, year } from "./profile";
跟 require.js 的执行结果是一致的,也就是将需要使用的模块先加载完再执行代码。
引用阮一峰老师的 《ECMAScript 6 入门》:
它们有两个重大差异。
第一个差异:
ES6 模块的运行机制与 CommonJS 不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令 import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。
换句话说,ES6 的 import 有点像 Unix 系统的“符号连接”,原始值变了,import 加载的值也会跟着变。因此,ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。
第二个差异可以从两个项目的打印结果看出,导致这种差别的原因是:
因为 CommonJS 加载的是一个对象(即 module.exports 属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。
鉴于浏览器支持度的问题,如果要使用 ES6 的语法,一般都会借助 Babel。
不过 Babel 只是把 ES6 模块语法转为 CommonJS 模块语法,然而浏览器是不支持这种模块语法的,所以直接跑在浏览器会报错的,如果想要在浏览器中运行,还是需要使用打包工具将代码打包,如 webpack。
但是 webpack 又是怎么做的打包的呢?它该如何将这些文件打包在一起,从而能保证正确的处理依赖,以及能在浏览器中运行呢?
首先为什么浏览器中不支持 CommonJS 语法呢?
这是因为浏览器环境中并没有 module、 exports、 require 等环境变量。
换句话说,webpack 打包后的文件之所以在浏览器中能运行,就是靠模拟了这些变量的行为。比如:
console.log("加载了 square 模块"); var multiply = require("./multiply.js"); var square = function(num) { return multiply.multiply(num, num); }; module.exports.square = square;
webpack 会将其包裹一层,注入这些变量:
(function (module, exports, require) { console.log("加载了 square 模块"); var multiply = require("./multiply"); module.exports = { square: function(num) { return multiply.multiply(num, num); } }; })()
原文链接:ES6 系列之模块加载方案
The text was updated successfully, but these errors were encountered:
No branches or pull requests
AMD 与 CMD 的区别
require.js:
sea.js 例子中的 main.js
AMD 是将需要使用的模块先加载完再执行代码,而 CMD 是在 require 的时候才去加载模块文件,加载完再接着执行。
CommonJS
AMD 和 CMD 都是用于浏览器端的模块规范,而在服务器端比如 node,采用的则是 CommonJS 规范。
跟 sea.js 的执行结果一致,也是在 require 的时候才去加载模块文件,加载完再接着执行。
导出模块的方式:
引入模块的方式:
CommonJS 与 AMD
引用阮一峰老师的《JavaScript 标准参考教程(alpha)》:
CommonJS 规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。
AMD 规范则是非同步加载模块,允许指定回调函数。
由于 Node.js 主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以 CommonJS 规范比较适用。
但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用 AMD 规范。
ES6
导出模块的方式:
引入模块的方式:
跟 require.js 的执行结果是一致的,也就是将需要使用的模块先加载完再执行代码。
ES6 与 CommonJS
引用阮一峰老师的 《ECMAScript 6 入门》:
它们有两个重大差异。
第一个差异:
ES6 模块的运行机制与 CommonJS 不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令 import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。
换句话说,ES6 的 import 有点像 Unix 系统的“符号连接”,原始值变了,import 加载的值也会跟着变。因此,ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。
第二个差异可以从两个项目的打印结果看出,导致这种差别的原因是:
因为 CommonJS 加载的是一个对象(即 module.exports 属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。
Babel
鉴于浏览器支持度的问题,如果要使用 ES6 的语法,一般都会借助 Babel。
不过 Babel 只是把 ES6 模块语法转为 CommonJS 模块语法,然而浏览器是不支持这种模块语法的,所以直接跑在浏览器会报错的,如果想要在浏览器中运行,还是需要使用打包工具将代码打包,如 webpack。
但是 webpack 又是怎么做的打包的呢?它该如何将这些文件打包在一起,从而能保证正确的处理依赖,以及能在浏览器中运行呢?
首先为什么浏览器中不支持 CommonJS 语法呢?
这是因为浏览器环境中并没有 module、 exports、 require 等环境变量。
换句话说,webpack 打包后的文件之所以在浏览器中能运行,就是靠模拟了这些变量的行为。比如:
webpack 会将其包裹一层,注入这些变量:
原文链接:ES6 系列之模块加载方案
The text was updated successfully, but these errors were encountered: