本篇文章给大家带来了关于JavaScript中的相关知识,其中主要介绍了模块化编程规范,CommonJS、AMD、CMD以及ES6的相关问题,希望对大家有帮助。
|
本篇文章给大家带来了关于javascript中的相关知识,其中主要介绍了模块化编程规范,CommonJS、AMD、CMD以及ES6的相关问题,希望对大家有帮助。
相关推荐:javascript学习教程 一、前言
那么,究竟什么什么是 二、AMD-异步模块定义
这里异步指的是不堵塞浏览器其他任务(
不同于 require([module], callback); 第一个参数 require(['math'], function(math) {
math.add(2, 3);})其中,回调函数中参数对应数组中的成员(模块)。
具体来说,就是模块书写必须使用特定的 define(id, dependencies, factory);
假定现在有一个 // math.jsdefine(function() {
var add = function(x, y) {
return x + y;
}
return {
add: add }})加载方法如下: // main.jsrequire(['math'], function(math) {
alert(math.add(1, 1));})如果 // math.jsdefine(['dependenceModule'], function(dependenceModule) {
// ...})当 三、CMD-同步模块定义
在 define(function(require, exports, module) {
// 模块代码});其中,
// CMDdefine(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b') // 依赖可以就近书写
b.doSomething()
// ... })// AMD 默认推荐的是define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
a.doSomething()
// 此处略去 100 行
b.doSomething()
...})四、CommonJS 规范
在兼容
2009年,美国程序员Ryan Dahl创造了
var math = require('math');然后,就可以调用模块提供的方法: var math = require('math');math.add(2,3); // 5
虽说
下面讲讲 1、原理 module exports require global 只要能够提供这四个变量,浏览器就能加载 下面是一个简单的示例。 var module = {
exports: {}};(function(module, exports) {
exports.multiply = function (n) { return n * 1000 };
}(module, module.exports))var f = module.exports.multiply;
f(5) // 5000上面代码向一个立即执行函数提供 module 和 exports 两个外部变量,模块就放在这个立即执行函数里面。模块的输出值放在 module.exports 之中,这样就实现了模块的加载。 2、Browserify 的实现 请看一个例子, // foo.jsmodule.exports = function(x) {
console.log(x);};// main.jsvar foo = require("./foo");foo("Hi");使用下面的命令,就能将 $ browserify main.js > compiled.js 其中, $ npm install browser-unpack -g 然后,将前面生成的compile.js解包。 $ browser-unpack < compiled.js [
{
"id":1,
"source":"module.exports = function(x) {\n console.log(x);\n};",
"deps":{}
},
{
"id":2,
"source":"var foo = require(\"./foo\");\nfoo(\"Hi\");",
"deps":{"./foo":1},
"entry":true
}]可以看到, 因为 五、ES6有关 要说
// a.jsvar b = require('./b');console.log(b.foo);setTimeout(() => {
console.log(b.foo);
console.log(require('./b').foo);}, 1000);// b.jslet foo = 1;setTimeout(() => {
foo = 2;}, 500);module.exports = {
foo: foo,};// 执行:node a.js// 执行结果:// 1// 1// 1上面代码说明,b 模块加载以后,它的内部 foo 变化就影响不到输出的 exports.foo 了。这是因为 foo 是一个原始类型的值,会被缓存。所以如果你想要在 // a.jsvar b = require('./b');console.log(b.foo);setTimeout(() => {
console.log(b.foo);
console.log(require('./b').foo);}, 1000);// b.jsmodule.exports.foo = 1; // 同 exports.foo = 1 setTimeout(() => {
module.exports.foo = 2;}, 500);// 执行:node a.js// 执行结果:// 1// 2// 2所以我们可以总结一下:
相关推荐:javascript视频教程 以上就是JavaScript模块化编程规范之CommonJS、AMD、CMD、ES6的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |
