[译]webpack相关概念: CommonJS与AMD

news/2024/7/7 5:28:37 标签: webpack, javascript

CommonJS

CommonJS通过定义模块格式,并确保在命名空间内每一个模块的执行来解决JavaScript作用域的问题。
其通过强制模块输出它们想要对外暴露的变量来实现,也通过定义其他正常工作所需模块来实现。
因此CommonJS提供了两个工具:

  1. 用来实现在当前作用域内引入一个已存在模块的require()方法

  2. 用来实现在当前作用域中输出的module对象

直接用JavaScript实现

不使用CommonJS的实现:

我们在名为salute.js的脚本文件中定义一个变量。该脚本仅包含一个将被其他脚本使用到的变量。

// salute.js
var MySalute = "Hello";

现在,在名为world.js第二个文件中,我们将使用在salute.js中定义的变量。

// world.js
var Result = MySalute + " world!";

现在让我们用CommonJS的来实现 hello world :

模块的定义

由于world.js只有在MySalute定义后才能作用,因此需要把每个脚本定义为模块:

// salute.js
var MySalute = "Hello";
module.exports = MySalute;
// world.js
var Result = MySalute + "world!";
module.exports = Result;

如上,我们使用特殊的object模块并通过在module.exports引用变量,这样CommonJS模块系统就会知道模块中的对象是我们想要输出的。就像salute.js中暴露的MySalute,world.js中暴露的Result。

模块的依赖

虽然我们离目标近了一步,但我们还缺少一个步骤即依赖的定义。我们已将每个脚本定义为独立的模块,但在world.js还需要知道是哪个模块定义了MySalute:

// salute.js
var MySalute = "Hello";
module.exports = MySalute;
// world.js
var MySalute = require("./salute");
var Result = MySalute + "world!";
module.exports = Result;

请注意,当require时,这里并没有使用文件全名salute.js而是使用./salute , 所以你可以删去脚本文件的扩展名。./符号意味着salute模块与world模块在同一目录下。

实例

函数

// moduleA.js
module.exports = function( value ){
    return value*2;
}
// moduleB.js
var multiplyBy2 = require('./moduleA');
var result = multiplyBy2( 4 );

AMD

AMD(全称:异步的模块定义)因其天然的异步性,被作为一种在浏览器环境中模块系统的解决方案(由于CommonJS模块系统是同步的而不适合使用在浏览器环境)。

AMD为模块化的JavaScript定义了一个标准:即模块可以异步加载其依赖,因而解决了同步调用产生的问题。

规则

使用define函数来定义模块

define

define函数描述了在AMD中模块是怎样定义的。其形如:

define(id?: String, dependencies?: String[], factory: Function|Object);

id

可选参数,用来规定模块的名称。

dependencies(依赖)

该参数规定了被定义模块有哪些依赖。它是由模块id组成的数组。这是一个可选参数,当未定义时将使用默认值[“require”, “exports”, “module”]。

工厂

最后一个参数将定义此模块的行为。其值可以是一个函数(因被调用一次)也可以是一个对象。 如果定义为工厂函数,那么返回值将被作为模块的出口暴露出来。

例子

下面是一些例子:

具名模块

定义一个依赖jQuery的具名模块myModule

define('myModule', ['jquery'], function($) {
    // $ is the export of the jquery module.
    $('body').text('hello world');
});
// and use it
require(['myModule'], function(myModule) {});

注意:在web pack中一个具名模块只是一个本地变量,而Require.js中一个具名模块是一个全局变量。

匿名模块

定义一个莫有id的匿名模块

define(['jquery'], function($) {
    $('body').text('hello world');
});

多个依赖

定义一个有多个依赖的模块。需要注意的是,每个依赖的出口都将作为参数传给工厂函数。

define(['jquery', './math.js'], function($, math) {
    // $ and math are the exports of the jquery module.
    $('body').text('hello world');
});

出口

定义一个将自身作为出口暴露出来的模块

define(['jquery'], function($) {

    var HelloWorldize = function(selector){
        $(selector).text('hello world');
    };

    return HelloWorldize;
});

使用require加载依赖

define(function(require) {
    var $ = require('jquery');
    $('body').text('hello world');
});

http://www.niftyadmin.cn/n/933732.html

相关文章

python字典update去重_Python字典的常用操作

字典常用的就是,他的去重。set集合是python的一个基本数据类型.set中的元素是不重复的.⽆无序的.⾥面的元素必须是可hash的(int, str, tuple,bool)。我们可以这样来记. set就是dict类型的数据但是不保存value, 只保存key. set也⽤{}表⽰注意:set中的元素是不重复的,…

二叉树后序遍历_LeetCode106 从中序与后序遍历序列构造二叉树

解题思路递归在后序遍历中,它的最后一个节点是根节点。根据根节点在中序遍历中的位置,我们可以定位到它的左边是左子树,右边是右子树。通过递归,根据左子树的后序和中序遍历,以及右子树的后序和中序遍历,不…

unity3d项目导入到eclipse

1.首先要 2.要记得工程的包名 3.打包成功后 工程内会有一个 temp文件夹 4.复制 TEMP下的此文件夹到电脑桌面 5.打开eclipse 导入 6. 7. 8.导入后选择项目设置 9. 10.保存完成后 新建一个android工程 11. 注意SDK兼容版本 与eclipse保持一致 12. 然后在新建工程内倒入unity的jar…

Kickstart无人值守安装系统

Kickstart无人值守安装系统1.导言已经或未来将从事Linux系统运维工作的读者,经常会遇到一些机器式的重复的共走,例如:有时间同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。q 光盘安装系统>一个的服务器DVD内置光驱百千块,百台服务器都配光…

c语言中switch case的用法_C语言基础--分支循环

分支循环分支if的用法及示例用法:满足条件执行,不满足条件不执行if注意事项:else 不需要可以省略if 后面不要加分号(小白注意)多个条件可以用逻辑运算符&&、||表达,详情参考运算符这一章{}里面语句…

的编码对照表_通关指南丨2021年海关商品编码对照表(含申报要素)

国务院关税税则委员会关于发布《中华人民共和国进出口税则(2021)》的公告税委会公告〔2020〕11号海关总署公告2020年第135号(关于执行2021年关税调整方案的公告)税委会〔2020〕33号国务院关税税则委员会关于2021年关税调整方案的通知关税税则委员会公告中给出的是PDF档&#xf…

Java开发配置

http://www.runoob.com/java/java-environment-setup.html转载于:https://www.cnblogs.com/GumpYan/p/5815999.html

floyd算法_算法学习笔记(6):最短路问题

https://zhuanlan.zhihu.com/p/105467597这篇文章应该会很长,因为我们要探讨图论中一个基本而重要的问题:最短路问题。如下图,我们想知道,某点到某点最短的路径有多长?图中点1到点4的最短路径长度应为3最短路问题分为两…