前言
本文不是 webpack 入门文章,如果对 webpack 还不了解,请前往题叶的 Webpack 入门,或者阮老师的 Webpack-Demos。
为什么要使用 Webpack
- 与 react 一类模块化开发的框架搭配着用比较好。
- 属于配置型的构建工具,比较用容易上手,160 行代码可大致实现 gulp400 行才能实现的功能。
- webpack 使用内存来对构建内容进行缓存,构建过程中会比较快。
第 3 点我想稍微论述一下,如果看过我之前写的 《如何写一个 webpack 插件(一)》,会发现,webpack 会将文件内容存在 compilation 这个大的 object 里面,方便各种插件,loader 间的调用。虽然 gulp 也用到了流 (pipe) 这样的内存处理方式,但感觉 webpack 更进一步。gulp 是每一个任务 (task) 用一个流,而 webpack 是共享一个流。
简要回顾 Webpack 的配置
Webpack 的配置主要为了这几大项目:
- entry:js 入口源文件
- output:生成文件
- module:进行字符串的处理
- resolve:文件路径的指向
- plugins:插件,比 loader 更强大,能使用更多 webpack 的 api
常用 Loaders 介绍
- 处理样式,转成 css,如:less-loader, sass-loader
- 图片处理,如: url-loader, file-loader。两个都必须用上。否则超过大小限制的图片无法生成到目标文件夹中
- 处理 js,将 es6 或更高级的代码转成 es5 的代码。如: babel-loader,babel-preset-es2015,babel-preset-react
- 将 js 模块暴露到全局,如果 expose-loader
常用 Plugins 介绍
- 代码热替换, HotModuleReplacementPlugin
- 生成 html 文件,HtmlWebpackPlugin
- 将 css 成生文件,而非内联,ExtractTextPlugin
- 报错但不退出 webpack 进程,NoErrorsPlugin
- 代码丑化,UglifyJsPlugin,开发过程中不建议打开
- 多个 html 共用一个 js 文件 (chunk),可用 CommonsChunkPlugin
- 清理文件夹,Clean
- 调用模块的别名 ProvidePlugin,例如想在 js 中用 $,如果通过 webpack 加载,需要将 $与 jQuery 对应起来
使用优化
了解了以上介绍的 Loaders 和 Plugins 之后,基本就可以搭建一整套基于 Webpack 的构建(不需要 gulp 与 grunt,合图除外)。下面让我来介绍一下在使用过程中的一些优化点。
优化点一. 如何区分开发及生产环境
- 在 package.json 里面的 script 设置环境变量,注意 mac 与 windows 的设置方式不一样
1 2 3 4 |
"scripts": { "publish-mac": "export NODE_ENV=prod&&webpack -p --progress --colors", "publish-win": "set NODE_ENV=prod&&webpack -p --progress --colors" } |
- 在 webpack.config.js 使用 process.env.NODE_ENV 进行判断
优化点二. 使用代码热替换
使用代码热替换在开发的时候无需刷新页面即可看到更新,而且,它将构建的内容放入内在中,能够获得更快的构建编译性能,因此是官方非常推荐的一种构建方式。
方法一:
方法二:
直接实现一个 server.js,启动服务器(需要启动热替换 plugin),下面是我在业务中用到的一个范例。具体的一些参数可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
var webpack = require('webpack'); var webpackDevMiddleware = require("webpack-dev-middleware"); var webpackDevServer = require('webpack-dev-server'); var config = require("./webpack.config.js"); config.entry.index.unshift("webpack-dev-server/client?http://localhost:9000"); // 将执替换js内联进去 config.entry.index.unshift("webpack/hot/only-dev-server"); var compiler = webpack(config); var server = new webpackDevServer(compiler, { hot: true, historyApiFallback: false, // noInfo: true, stats: { |