webpack+babel加载es6模块
问题出现
最近在学es6,一些新的特性,比如for-of、扩展运算符、生成器、迭代器等是可以在一些较为流行的浏览器上直接运行的,比如最新的firefox、chrome等都已经从不同程度上实现了对es6语法的支持。
但是,今天看了ES6 In Depth: Modules这篇文章,当我写了一个小Demo并且打算在浏览器上运行看看时,我发现,所有浏览器均不支持import
和export
语法。es6提供了这么好的模块化编程语法,不能运行在浏览器上太可惜啦,所以,我开始寻找解决方法。
解决过程
既然不能运行es6,那么将es6转化为es5应该可以吧。于是,我想到了babel这个JavaScript编译器,它可以将下一代的JavaScript转化为es5。
然而,只是将es6转化为es5还是不够的。babel提供了一个在线的js转换器,可以一边写es6,一边看转化后的es5。我在这个在线转换器中,输入了import
语句,转换结果如下:
|
|
并且在页面底部显示:
require is not supported in the browser, you need a commonjs environment such as node.js/io.js, browserify/webpack etc
意思就是:require
属于commonjs
规范的东西,浏览器js是不支持这个语法的,你只能在实现了commonjs
规范的环境中运行,比如node.js/io.js
,或者利用browserify/webpack
等工具。
所以,仅仅使用babel将es6的import语法转化为require语句,还是不能再浏览器端运行。我们还需要实现了commonjs规范,并且能够解析模块之间依赖关系的工具。
这种情况下,我想到了webpack,这个模块打包机(module bundler)。
webpack基本使用
webpack可以干什么
webpack是一个前端模块化管理和打包工具。它具有以下几个特点:
- 它可以将许多相互耦合的模块,按照依赖关系,打包成符合生产环境部署的前端资源。
- 通过各种
loader
,它可以将任何形式的资源都视作模块,比如commonjs模块、AMD模块、ES6模块、CSS、图片、SASS、JSON等。 - 它可以将按需加载的模块进行代码分割,等到实际需要的时候再异步加载。
webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(比如index.html
),webpack将从这个文件开始找到你项目的所有依赖文件,使用loaders
处理他们,并且最终打包为浏览器可识别的静态资源。
上问题的解决就是使用wbepack + babel-loader
来解决的。
安装
|
|
我两条命令都执行了,这样webpack可以作为依赖加入到package.json
文件中。
现在,我的项目文件夹myApp
下面有一个文件夹node__modules
和一个package.json
文件。
初始化项目结构
现在我们可以将项目文件夹初始化为以下的样子:
对其中各个文件说明如下:
|
|
其中index.html
文件代码如下:
|
|
app.js
使用了import
语法,它作为webpack打包的入口文件:
|
|
printColor.js
导出了一个方法:
|
|
安装bebal-loader
loaders需要单独安装,并且需要在webpack.config.js
下的modules
关键字下进行配置。其配置项包括以下几项:
|
|
我们通过以下命令来安装babel-loader:
|
|
配置
完成babel-loader的安装后,我们对webpack.config.js
进行配置,最终该文件内容如下:
|
|
其中__dirname
是node.js的一个全局变量,它指向当前执行脚本所在的目录。
关于babel-loader更详细的配置,可以看这里
开始使用
终于完成了大部分工作,现在我们开始运行项目吧!
在命令行输入以下命令:
|
|
输出结果如下:
|
|
并且发现在bin
目录下多出了一个bundle.js
文件,这个文件就是webpack打包后的文件,也是我们在index.html
中引入的文件。
然后我们在浏览器中打开index.html
中文件,内容如下:
完成!这样我们就可以开心地写es6模块,并且让代码在浏览器中完美运行了!
更快捷地打包
以后,我们在修改文件后,只需要在命令行中运行webpack
这条命令就可以了。但是,对于只局部安装webpack的情况,我们需要执行node_modules/.bin/webpack
这样一条很繁琐的命令。
还好,npm可以引导任务执行,我们修改package.json
后,就可以使用比如npm start
或者npm run <script>
这样的形式来代替原来的命令,修改后的package.json
文件内容如下:
|
|
现在,我们就可以运行npm start
来打包啦~
npm start
是一个比较特殊的脚本名称,如果对应的脚本不是start
,想要在命令行中运行时,需要这样用npm run {script named}
,比如npm run dev
或者npm run build
。
开发环境
当项目逐渐变大,webpcak编译时间会边长,我们可以通过参数让编译内容带有进度和颜色。
|
|
如果不想每次修改代码都手动重新打包,可以开启监听模式。开启监听模式后,没有变化的模块会在编译后缓存到内存中,而不会每次都重新编译,所以监听模式的速度是很快的。
|
|
webpack其实可以使用webpack-dev-server
基于node.js搭建一个本地服务器,并且会以监听模式自动运行webpack,在浏览器打开http://127.0.0.1:8080
就可以访问我们的项目资源,并且可以实时监听代码变化并作出改变。
关于webpack-dev-server的详细使用,可以看这里。
|
|