Thanks to Webpack 傻瓜指南
启用 Source Map
在 webpack.config.js 中添加字段
devtool: 'eval-source-map',
`</pre>
这样出错后会采用 sourceMap 直接显示出错位置
### 配置 webpack-dev-server
在 webpack.config.js 中添加字段
<pre>`devServer: {
historyApiFallback: true,
hot: true,
inline: true,
progress: true,
}
`</pre>
### 使用 preLoaders 和 postLoaders
preLoaders 在 loaders 之前执行, 总体顺序是 preLoader -> loaders -> postLoaders
#### 安装 jshint
<pre>`npm install --save-dev jshint-loader
`</pre>
在 config 中配置
<pre>`module:{
preloaders:[
{
test: /\.jsx$/,
loader:'jshint-loader'
}
]
}
jshint:{
'esnext':true
}
`</pre>
### 部署上线
项目开发完成后需要部署上线, 此时应该创建一个新的 config, 因为部署上线使用的 webpack 不需要 dev-tools, dev-server, jshint 等
复制现有的 config 文件, 命名为 webpack.production.config.js, 将里面与开发有关的东西删除, 在 package.json 中添加
<pre>`"scripts":{
"build": "webpack --progress --profile --colors --config webpack.production.config.js"
},
`</pre>
上线的时候运行
<pre>`npm run build
`</pre>
### 分离第三方库
如果第三方库很多, 会导致最后 bundle 文件很大, 减慢加载速度, 因此需要把第三方库和 app 本身的代码分开
#### 修改 entry 入口文件
<pre>`entry:{
app: path.resolve(APP_PATH, 'index.js'),
//添加要打包在 vendors 里面的库
vendors: ['jquery', [moment]]
},
`</pre>
#### 添加 CommonsChunkPlugin
<pre>`plugins: [
//使用 uglifyJs 压缩 js 代码
new webpack.optimize.UglifyJsPlugin({minimize: true}),
//把入口文件里的数组打包成 vendors.js
new webpack.optimize.CommonsChunkPlugin('vendors','vendors.js'),
new HtmlWebpackPlugin({title: 'Welcome'})
]
`</pre>
运行 build 后会生成 vendor.js
### 生成多页面
假设需求是生成两个页面, 一个叫 index.html, 需要引用 app.js 和 vendors.js 两个文件; 另一个是 mobile.html, 需要应用 mobie.js 和 vendor.js 这两个文件
首先新建一个叫 mobile.js 的文件入口, 比 app.js 简单一些
<pre>`import './main.scss';
import $ from 'jquery';
import 'imports?jQuery=jQuery!./plugin.js';
$(document).ready(function(){
let app = document.createElement('div');
app.innerHTML = '<h1>Hello World</h1>';
document.body.appendChild(app);
$('h1').greenify();
});
`</pre>
在 config 修改入口文件和输出配置
<pre>`entry:{
// 三个入口文件: app, mobile, vendors
app: path.resolve(APP_PATH, 'index.js'),
mobile: path.resolve(APP_PATH, 'mobile.js'),
vendors: ['jquery','moment']
},
output:{
path: DIST_PATH,
filename: '[name].js'
},
`</pre>
为 html-webpack-plugin 设置模板, 并保存于 templates
<pre>`// index.html
<!DOCTYPE html>
<html>
<head>
<title>{%= o.htmlWebpackPlugin.options.title %}</title>
</head>
<body>
<h3>Welcome to Index</h3>
</body>
</html>
//mobile.html
<!DOCTYPE html>
<html>
<head>
<title>{%= o.HtmlWebpackPlugin.options.title %}</title>
</head>
<body>
<h3>Welcome to Mobile</h3>
</body>
</html>
`</pre>
继续配置 config.js, 让 HtmlWebpackPlugin 可以生成多个文件
<pre>`//Templates 的文件夹路径
var TEM_PATH = path.resolve(ROOT_PATE, 'templates');
...
plugins:[
//创建两个 HtmlWebpackPlugin 的实例, 生成两个页面
new HtmlWebpackPlugin({
title: 'Hello World App',
template: path.resolve(TEM_PATH, 'index.html'),
filename: 'index.html'
//chunks 这个参数告诉插件要引用 chunks 中的那几个入口
chunks: ['app','vendors'],
//scripts 要插入的位置
inject: 'body'
}),
new HtmlWebpackPlugin({
title: 'Hello Mobile App',
template: path.resolve(TEM_PATH, 'mobile.html'),
filename: 'mobile.html',
chunks: ['mobile','vendors'],
inject: 'body'
})
]
生成 hash 名称的 script 来防止缓存
webpack 基于 md5 可以生成 hash 名称
```
output:{
path: DIST_Path,
filename: ‘[name].[hash].js’
},