diff --git a/09-Node.js/02-JavaScript模块化01:CommonJS.md b/09-Node.js/02-JavaScript模块化01:CommonJS.md index c7248ad..821d577 100644 --- a/09-Node.js/02-JavaScript模块化01:CommonJS.md +++ b/09-Node.js/02-JavaScript模块化01:CommonJS.md @@ -218,7 +218,7 @@ app.js 其他的参数,一路回车即可。效果如下: -20180410_1425.png +![](http://img.smyhvae.com/20180410_1425.png) 于是,根目录下会自动生成`package.json`这个文件。点进去看一下: @@ -248,12 +248,12 @@ app.js 安装成功后,根目录下会自动生成相应的文件: -20180410_1450.png +![](http://img.smyhvae.com/20180410_1450.png) 需要说明的是,我的node版本是 v8.10.0(v8以上),对应的 npm 版本是 v5.6.0,版本比较高,因此,当我输入完`npm install uniq`之后,`package.json`中就会自动添加`uniq`包的依赖: -20180410_18-55.png +![](http://img.smyhvae.com/20180410_1855.png) 如果有些童鞋的npm版本较低,就需要手动去添加依赖;另一种方式是,可以使用`npm install uniq --save`命令,这个多出来的`--save`就可以自动添加依赖。 @@ -272,7 +272,7 @@ app.js 可以看出,这个包可以起到数组去重的作用。 -### 3、自定义模块 & 代码运行 +### 3、自定义模块 (1)module1.js: @@ -309,7 +309,7 @@ module.exports = function(){ ```javascript //暴露方式二:exports.xxx = value -//可以往export对象中不断地添加属性,进行暴露 +//可以往 export 对象中不断地添加属性,进行暴露 exports.foo1 = function(){ console.log('module3 中的 foo1 方法'); @@ -557,25 +557,19 @@ GitHub: - 自然直观的代码组织方式。 - -20180303_2107.png - - +![](http://img.smyhvae.com/20180303_2107.png) ### RequireJS(AMD)、SeaJS(CDM)、CommonJS、ES6 的对比 1、RequireJS 和 AMD: - -20180303_1653.png +![](http://img.smyhvae.com/20180303_1653.png) 异步模块定义,特点是依赖前置。 - 2、SeaJS 和 CMD: - 同步模块定义。 ```javascript @@ -592,7 +586,7 @@ GitHub: 3、CommonJS: -20180303_1701.png +![](http://img.smyhvae.com/20180303_1701.png) 以上三个都是 ES5里面的规范。 @@ -600,7 +594,7 @@ GitHub: ES6的特性:export/import -20180303_1704.png +![](http://img.smyhvae.com/20180303_1704.png) diff --git a/09-Node.js/02-JavaScript模块化02:AMD.md b/09-Node.js/02-JavaScript模块化02:AMD.md index 7b167c7..5aac0cf 100644 --- a/09-Node.js/02-JavaScript模块化02:AMD.md +++ b/09-Node.js/02-JavaScript模块化02:AMD.md @@ -41,8 +41,6 @@ define(['module1', 'module2'], function (m1, m2) { - 第二个参数是function,里面带了形参 m1 和 m2,分别代表了 module1 和 module2。这个形参的作用是,前面依赖的模块一旦声明了,就可以一一对应地注入到 function中去,从而在 function 内部使用依赖的模块。这种方式称之为**显式声明依赖注入**。 - - ### 引入模块的方式 在主模块中引入其他的模块: @@ -57,21 +55,16 @@ require(['module1', 'module2'], function (m1, m2) { }) ``` - ### RequireJS:是AMD的实现 - - - - ## RequireJS的使用举例(自定义模块) - ### 1、创建项目结构 - 在工程文件中新建如下目录: @@ -87,10 +80,9 @@ js index.html ``` - 所有的代码写完之后,项目结构如下: -20180411_1331.png +![](http://img.smyhvae.com/20180411_1331.png) ### 2、下载require.js,并导入 @@ -101,13 +93,12 @@ index.html 在官网下载`require.js`文件: -20180411_1127.png +![](http://img.smyhvae.com/20180411_1127.png) 然后将`require.js`文件拷贝到项目的`js/libs/`目录中。 这样的话,就导入成功了。 - ### 3、自定义模块 (1)dataService.js: @@ -128,7 +119,6 @@ define(function () { 这模块没有依赖。 - (2)alerter.js: ```javascript @@ -166,13 +156,14 @@ requirejs(['myAlerter'], function (alerter) { })(); ``` - 这个模块,依赖了`myAlerter`这个模块,模块名是我自己起的。并且,我们在文件的上方做了映射,将`myAlerter`这个名字和`alerter.js`文件关联了起来。 我们来讲一下最上方的几行代码(即`requirejs.config`里的内容)的意思: -目前为止,我们可以看到:文件(3)依赖了文件(2),文件(2)依赖了文件(1)。`paths`里做的就是映射:将键`myDataService`和`dataService.js`进行关联,将键`myAlerter`和`alerter.js`文件进行关联。 +- 我们可以看到,文件(3)依赖了文件(2),文件(2)依赖了文件(1)。 + +- `paths`里做的就是映射:将键`myDataService`和文件`dataService.js`进行关联,将键`myAlerter`和文件`alerter.js`进行关联。 另外,再讲一下注释里的`baseUrl`的用法:如果没有这个注释,那么`paths`里的路径,是从**当前这个文件**(main.js)的角度出发的;如果加了一行`baseUrl`,表明它是 paths 里所有路径的最开头的部分,`baseUrl`的路径是从**项目的根目录**的角度出发的。 @@ -204,66 +195,10 @@ requirejs(['myAlerter'], function (alerter) { 运行 index.html,打印结果如下: -20180411_1740.png +![](http://img.smyhvae.com/20180411_1740.png) 项目源码:[2018-04-11-RequireJSDemo](https://download.csdn.net/download/smyhvae/10341963) - - - - - - - - -```javascript - -``` - - - - - - - - -```javascript - -``` - - - - - - - - - -```javascript - -``` - - - - - - - - -```javascript - -``` - - - - - - - - - - - diff --git a/09-Node.js/02-JavaScript模块化04:ES6.md b/09-Node.js/02-JavaScript模块化04:ES6.md index 22654ed..32e296c 100644 --- a/09-Node.js/02-JavaScript模块化04:ES6.md +++ b/09-Node.js/02-JavaScript模块化04:ES6.md @@ -33,7 +33,7 @@ ``` -## ES6模块化的使用(举例) +## ES6模块化的使用举例(自定义模块) ### 1、初始化项目 @@ -94,7 +94,7 @@ index.html (1)module1.js: -```java +```javascript //暴露模块:采用分别暴露的方式 export function foo1() { @@ -106,16 +106,122 @@ export function foo2() { } export let arr = [1, 2, 3, 4, 5]; - - - ``` -(4)main.js: +(2)module2.js: -ES6的 import 语法中,在引入时,要求用**对象解构赋值**的形式。而不是用 `import myModule from ...`这种形式。【重要】 +```javascript +//暴露模块:采用统一暴露的方式 + +function fn1() { + console.log('我是 module2 中的 fn1'); +} + +function fn2() { + console.log('我是 module2 中的 fn2'); +} + +//统一暴露 +export { fn1, fn2 }; +``` + + +(3)module3.js: + + + +```javascript +//暴露模块:采用默认暴露的方式。 +//默认暴露的方式可以暴露任意数据类型,暴露的是什么数据,接收到的就是什么数据 + +//语法格式:export default value; +export default () => { + console.log('我是 module3 中 default 方式暴露的函数'); +}; +``` + + +这里,我们采取了一种新的暴露方式(默认暴露),在暴露时,加上了`default`这个关键字。代码里暴露了一个箭头函数,稍后,我们注意在main.js里是怎么引入module3.js的。 + +注意,我们只能写一次 default,也就是说,只能进行一次默认暴露。 + +(4)module4.js:(default方式暴露多个属性) + +```javascript +//暴露模块:采用默认暴露的方式。 +//默认暴露的方式可以暴露任意数据类型,暴露的是什么数据,接收到的就是什么数据 + +//语法格式:export default value; +export default { + name: '我是 module4 中 default 方式暴露的属性 name', + foo() { + console.log('我是 module4 中 default 方式暴露的函数 foo'); + } +} +``` + +这里,我们依旧采取了默认暴露的方式,只能写一次 default。代码里暴露了一个对象(对象里存放了一个属性、一个方法)。稍后,我们注意在main.js里是怎么引入module4.js的。 + +如果我想暴露多个属性、多个对象怎呢?很简单,把你想要暴露的所有内容,都放在default里,包成一个对象。你看module4.js就是如此, 同时暴露了多个属性&方法。 + +(5)main.js: + +这个是主模块。现在,我们来看一下,它如何引入上面的四个模块。 + + +```javascript + +//主模块。引入其他的模块 + +import { foo1, foo2 } from './module1'; //采用解构赋值的形式进行导入。注意,括号里的对象名,要和 module1 中的对象名一致。 +import { fn1, fn2 } from './module2'; //采用解构赋值的形式进行导入。注意,括号里的对象名,要和 module1 中的对象名一致。 +import myModule3 from './module3'; //module3 模块是采用 default 方式进行暴露的,myModule4 这个名字是我随便起的 +import myModule4 from './module4'; //module4 模块是采用 default 方式进行暴露的,myModule4 这个名字是我随便起的 + +//调用module1、module2中的内容 +foo1(); +foo2(); +fn1(); +fn2(); + +//调用module3中的内容 +myModule3(); + +//调用module4中的内容 +console.log(myModule4.name); //module4中的属性 +myModule4.foo(); //module4中的方法 +``` + +我们可以看出:(具体请看注释,非常重要) + +- module1和module2是采用**常规暴露**的形式,在引入它们时,模块名要一致。而且,要求用**对象解构赋值**的形式,而不是用 `import myModule from ...`这种形式(否则会报错 undefined)。 + +- module2和module3是采用**默认暴露**的形式,在引入它们时,模块名随便起。 + +(6)index.html: + +在这里引入main.js即可。 + +```html + + + + + + + + Document + + + + + + + + +``` ### 4、编译转换 @@ -127,16 +233,16 @@ ES6的 import 语法中,在引入时,要求用**对象解构赋值**的形 (1)利用 babel 将 ES6 转换为 ES5: - ``` - babel src -d build //build目录会自动生成 +babel src -d build //build目录会自动生成 ``` 上方命令的意思是,将`src`目录下的所有ES6文件转化为ES5文件,并放在`build`目录下(`build`目录会被自动创建)。 - 转化成ES5之后,我们发现,如果直接在 index.html 中加载`build`目录下的ES5文件,也是会报错的,因为浏览器不认识`main.js`里的`require`关键字: +20180414_1410.png + 于是,我们还要进行一次转换。 @@ -151,6 +257,34 @@ dist/main.js就是我们需要引入到 index.html 里的文件。 以后,我们每次修改完ES6的代码,就要执行上面的两个命令,重新生成新的js文件。 +运行效果: + +20180414_1615.png + +工程文件: + +- [2018-04-13-ES6Demo.rar](https://download.csdn.net/download/smyhvae/10348940) + + +## ES6模块化的使用举例(第三方模块) + +下载 jQuery 包: + +``` +npm install jquery@1 //下载jQuery 1.X 的版本里最新的 +``` + +在main.js 中引入上面的 jQuery: + +``` +import $ from 'jQuery'; +``` + + +然后我们就可以通过`$`这个符号去写jQuery的代码了。 + + +