前端入门22-讲讲模块化 (6)

其实,CMD 跟 CommonJS 很类似,甚至在模块化方面的工作,可以很通俗的将 sea.js 理解成 node.js 所做的事,只是有些 node.js 能完成但却无法通过 sea.js 来负责的工作需要开发人员手动处理,比如定义一个模块、通过 <script> 加载 sea.js 和指定主入口的 js 的工作。

CommonJS, AMD, CMD 三者间区别

下面分别从适用场景、使用步骤、使用方式、特性等几个方面来对比这些不同的规范:

适用场景

CommonJS 用于服务端,基于 Node.js 的运行环境;

AMD 和 CMD 用于前端,基于浏览器的运行环境;

使用方式

CommonJS 通过 require 来依赖其他模块,通过 exports 来为当前模块暴露接口;

AMD 通过 define 来定义模块,通过 requirejs.config 来配置模块路径信息,通过 require 来依赖其他模块,通过 retrurn 来暴露模块接口;

CMD 通过 define 来定义模块,通过 require 来依赖其他模块,通过 exports 来为当前模块暴露接口;

使用步骤

CommonJS 适用的 Node.js 运行环境,无需其他步骤,正常使用模块技术即可;

AMD 适用的前端浏览器的运行环境没有 Require.js,所以项目中需要先加载 Require.js,然后再执行主入口的 js 代码,需要在 HTML 中使用类似如下命令:

<script src="http://www.likecs.com/js/lib/require.js" data-main="js/src/main.js"></script>

CMD 适用的前端浏览器的运行环境也没有 Sea.js,所以项目中也需要先加载 Sea.js,然后再执行主入口的 js 代码,需要在 HTML 中使用类似如下命令:

<script src="http://www.likecs.com/js/lib/sea.js"></script> <script> seajs.use("./js/src/main.js"); </script>

#### 特性

AMD:依赖前置、提前执行,如:

require(['module1','module2'], function(m1, m2){ //... }) define(['module1','module2'], function(m1, m2){ //... })

需要先将所有的依赖的加载完毕后,才会去处理回调中的代码,这叫依赖前置、提前执行;

CMD:依赖就近、延迟执行,如:

define(function(require, exports, module){ //... var module1 = require("./module1"); //... require("./module2", function(m2){ //... }); })

等代码执行到 require 这行代码时才去加载对应的模块

ES6标准

ES6 中新增的模块特性,在上一篇中已经稍微介绍了点,这里也不具体展开介绍了,需要的话开头的声明部分有给出链接,自行查阅。

这里就简单说下,在前端浏览器中使用 ES6 模块特性的步骤:

定义模块,通过指定 <script type="module"> 方式

依赖其他模块使用 import,模块对外暴露接口时使用 export;

需要注意的一点是,当 JS 文件内出现 import 或者 export 时,这份 JS 文件必须声明为模块文件,即在 HTML 文档中通过指定 <script> 标签的 type 为 module,这样 import 或 export 才能够正常运行。

也就是说,使用其他模块的功能时,当前的 JS 文件也必须是模块。

另外,有一点,ES6 的模块新特性,所有作为模块的文件都需要开发人员手动去 HTML 文档中声明并加载,这是与其他方案不同的一点,ES6 中 import 只负责导入指定模块的接口而已,声明模块和加载模块都需要借助 <script> 实现。

这里不详细讲 ES6 的模块特性,但想来讲讲,一些转换工作的配置,因为:

有些浏览器不支持 ES6 的语法,写完 ES6 的代码后,需要通过 Babel 将 ES6 转化为 ES5。

生成了 ES5 之后,里面仍然有 require 语法,而浏览器并不认识 require 这个关键字。此时,可以用 Browserify 编译打包 js,进行再次转换。

而我是选择使用 WebStrom 作为开发工具的,所以就来讲讲如何配置

WebStrom 的 Babel 配置

教程部分摘抄自:ES6的介绍和环境配置

新建项目

通过 npm 初始化项目

在安装 Babel 之前,需要先用 npm 初始化我们的项目。打开终端或者通过 cmd 打开命令行工具,进入项目目录,输入如下命令: npm init -y,命令执行结束后,会在项目根目录下生成 package.json 文件

(首次)全局安装 Babel-cli

在终端里执行如下命令:

npm install -g babel-cli

本地安装 babel-preset-es2015 和 babel-cli

npm install --save-dev babel-preset-es2015 babel-cli

本地是指在项目的根目录下打开终端执行以上命令,执行结束,项目根目录的 package.json 文件中会多了 devDependencies 选项

新建 .babelrc 文件

在根目录下新建文件 .babelrc,输入如下内容:

{ "presets":[ "es2015" ], "plugins":[] }

执行命令转换

babel js/src/main.js -o js/dist/main.js

-o 前是原文件,后面是转换后的目标文件

这是我的项目结构:

前端入门22-讲讲模块化

.json 文件和 node_modules 文件夹都是操作完上述步骤后会自动生成的,最后执行完命令后,会在 dist 目录下生成目标文件。

(可选)如果嫌每次执行的命令太过复杂,可利用 npm 脚本

将 babel js/src/main.js -o js/dist/main.js 这行代码复制到 package.json 里的 scripts 字段中:

前端入门22-讲讲模块化

以后每次都点一下 build 左边的三角形按钮运行一下脚本就可以了,省去了手动输命令的时间。

(可选)如果还嫌每次手动点击按钮运行脚本麻烦,可配置监听文件改动自动进行转换

打开 WebStrom 的 Setting -> Tools -> File Watchers,然后点击 + 按钮,选择 Babel 选项,然后进行配置:

前端入门22-讲讲模块化

最后,以后每次新的项目,除了第 3 步不用了之外,其余步骤仍旧需要进行。

WebStrom 的 Browserify 配置

步骤跟上述很类似,区别仅在于一个下载 babel,这里下载的是 browserify,以及转换的命令不同而已:

新建项目

通过 npm 初始化项目

打开终端,进入到项目的根目录,执行 npm init -y,执行结束后会在根目录生成 package.json 文件

(首次)全局安装 browserify

在终端里执行如下命令:

npm install browserify -g

执行命令转换

browserify js/src/main.js -o js/dist/main.js --debug

-o 前是原文件,后面是转换后的目标文件

(可选)如果嫌每次执行的命令太过复杂,可利用 npm 脚本

将 browserify js/src/main.js -o js/dist/main.js --debug 这行代码复制到 package.json 里的 scripts 字段中:

前端入门22-讲讲模块化

以后每次都点一下 build 左边的三角形按钮运行一下脚本就可以了,省去了手动输命令的时间。

(可选)如果还嫌每次手动点击按钮运行脚本麻烦,可配置监听文件改动自动进行转换

打开 WebStrom 的 Setting -> Tools -> File Watchers,然后点击 + 按钮,选择 <custom> 选项,然后进行配置:

前端入门22-讲讲模块化

最后,以后每次新的项目,除了第 3 步不用了之外,其余步骤仍旧需要进行。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzgpj.html