本文主要根据阮一峰老师的webpack-demos进行一些提炼。Webpack作为目前作为火热的前端构建工具,redux的官方示例中也使用到了webpack-dev-middleware
、webpack-hot-middleware
等,便想再次总结学习一下。
入口与出口文件
entry为入口文件,output为出口文件,通过webpack的处理,当前目录下的main.js会转变为bundle.js。
|
|
当然多入口与多出口文件也是被允许的,例如下面的例子,main1.js转变为bundle1.js,main2.js转变为bundle2.js。
|
|
path
是打包文件存放的绝对路径,publicPath
是网站运行时的访问路径,也可以说是生产环境吧。
Babel加载
Babel目前也非常常见,ES6/7的新特性使用,React的JSX的编译,都需要Babel的帮助。而在webpack的配置中可以集成Babel。
|
|
即使这样配置,你可能还会遇到某些特性的使用依然报错,这时你就需要查阅一下啦,可能这些特性仍然处于语法提案阶段,npm install相应的babel-preset-stage,在presets中添加即可。
CSS加载
CSS也可以直接require在JS代码当中,在main.js中require(‘./app.css’),在webpack中配置:
|
|
CSS需要先通过css-loader被读取,然后通过style-loader以内联的形式添加进入HTML页面。!
来维持了前后顺序。当然要使用Less、Sass等预处理语言也是没有问题的,这些都可以被集成在webpack的配置当中。
|
|
图片加载
JS或是CSS中包含着图片,比如JS插入一个img,CSS中的background,意味着多一次http请求,webpack可以将小图片转化为Data URL。
|
|
webpack自身插件
在webpack中存在很多插件去扩展它的功能,其中有一个就是UglifyJs Plugin,主要是用于混淆和压缩。
|
|
webpack第三方插件
你也可以使用很多webpack的第三方插件,比如html-webpack-plugin
会为你创建一个index.html,open-browser-webpack-plugin
会为你自动打开地址。
|
|
环境标记
通过环境标志可以区分生产环境与开发环境,如果只想在开发环境中执行某些操作,可以在执行这些操作前判断__DEV__
|
|
相应OS对应的命令
|
|
模块化js
对于大型js应用来说,必定需要采用模块化。webpack很好地支持js模块化(require,支持ES6可使用import),并会将各个js汇总打包成一个bundle.js。
多个js文件可能会共用一些js模块,webpack可以使用CommonsChunkPlugin
自动提取
|
|
main1.jsx与main2.jsx共用react与react-dom,共用模块会生成init.js,main1.jsx生成bundle1.js,main2.jsx生成bundle2.js
|
|
对于一些常用的第三方js库,比如jquery,我们不必把它合并到自己的js当中,也可以将其设置为全局变量,不必再require
|
|
也可以添加一些自定义的js,如果你不想包含在webpack的bundle中。通过webpack后,直接require。
|
|
webpack热加载
webpack热加载在开发环境下,无需刷新,即可看到当前代码改动效果,目前共有两种方法:
(1) 使用命令行模式$ webpack-dev-server --hot --inline
--hot
与--inline
相当于添加了HotModuleReplacementPlugin
切换到服务器热加载模式,添加webpack/hot/dev-server
入口,在bundle
中运行webpack-dev-server
(2) 配置webpack.config.js
|
|
省略文件扩展名
在require时可省略文件扩展名,只需要在webpack.config.js中添加resolve.extensions
来配置
|
|
Express与webpack
在Express中主要是添加webpack-dev-middleware
和webpack-hot-middleware
两个中间件。
webpack-dev-middleware
与上文webpack-dev-server
类似,用于处理静态资源。
webpack-hot-middleware
就是HMR(Hot Module Replacement),用于无刷新更新。