02-JavaScript模块化04:ES6
ES6模块化的基本语法
ES6模块化的说明
**依赖模块需要编译打包处理。**原因如下:
-
(1)有些浏览器不支持 ES6 的语法,写完 ES6 的代码后,需要通过
Babel
将 ES6 转化为 ES5。 -
(2)生成了ES5之后,里面仍然有
require
语法,而浏览器并不认识require
这个关键字。此时,可以用Browserify
编译打包 js,进行再次转换。
推荐学习链接:
基本语法:
导出模块:
1 | export |
引入模块:
1 | import xxx from '路径' |
ES6模块化的使用举例(自定义模块)
1、初始化项目
(1)在工程文件中新建如下目录:
1 | js |
(2)在工程的根目录下,新建文件package.json
,内容如下:
1 | { |
2、环境配置:安装babel 和 browserify等
(1)安装babel 和 browserify:
1 | npm install babel-cli -g |
安装 babel 的详细解释,可以参考本人的另外一篇文章:ES6的介绍和环境配置
(2)新建.babelrc:
在根目录下新建文件.babelrc
,输入如下内容:
1 | { |
3、编写代码
(1)module1.js:
1 | //暴露模块:采用分别暴露的方式 |
(2)module2.js:
1 | //暴露模块:采用统一暴露的方式 |
(3)module3.js:
1 | //暴露模块:采用默认暴露的方式。 |
这里,我们采取了一种新的暴露方式(默认暴露),在暴露时,加上了default
这个关键字。代码里暴露了一个箭头函数,稍后,我们注意在main.js里是怎么引入module3.js的。
注意,我们只能写一次 default,也就是说,只能进行一次默认暴露。
(4)module4.js:(default方式暴露多个属性)
1 | //暴露模块:采用默认暴露的方式。 |
这里,我们依旧采取了默认暴露的方式,只能写一次 default。代码里暴露了一个对象(对象里存放了一个属性、一个方法)。稍后,我们注意在main.js里是怎么引入module4.js的。
如果我想暴露多个属性、多个对象怎呢?很简单,把你想要暴露的所有内容,都放在default里,包成一个对象。你看module4.js就是如此, 同时暴露了多个属性&方法。
(5)main.js:
这个是主模块。现在,我们来看一下,它如何引入上面的四个模块。
1 |
|
我们可以看出:(具体请看注释,非常重要)
-
module1和module2是采用常规暴露的形式,在引入它们时,模块名要一致。而且,要求用对象解构赋值的形式,而不是用
import myModule from ...
这种形式(否则会报错 undefined)。 -
module2和module3是采用默认暴露的形式,在引入它们时,模块名随便起。
(6)index.html:
在这里引入main.js即可。
1 |
|
4、编译转换
如果我们不进行转换,而是直接在 index.html 中加载 js/src/main.js,是会报错的:
接下来,我们就进行转换。
(1)利用 babel 将 ES6 转换为 ES5:
1 | babel src -d build //build目录会自动生成 |
上方命令的意思是,将src
目录下的所有ES6文件转化为ES5文件,并放在build
目录下(build
目录会被自动创建)。
转化成ES5之后,我们发现,如果直接在 index.html 中加载build
目录下的ES5文件,也是会报错的,因为浏览器不认识main.js
里的require
关键字:
于是,我们还要进行一次转换。
(2)利用Browserify
编译打包 build
目录下的 ES5 文件:
1 | browserify build/main.js -o dist/main.js //dist目录需要手动创建 |
dist/main.js就是我们需要引入到 index.html 里的文件。
以后,我们每次修改完ES6的代码,就要执行上面的两个命令,重新生成新的js文件。
运行效果:
工程文件:
ES6模块化的使用举例(引入第三方模块)
下载 jQuery 包:
1 | npm install jquery@1 //下载jQuery 1.X 的版本里最新的 |
在main.js 中引入上面的 jQuery:
1 | import $ from 'jQuery'; |
然后我们就可以通过$
这个符号去写jQuery的代码了。