webpack那些事儿03
更新日期:
本节主要讲述 webpack的两大经典开发调试插件,热插拔内存缓存机制
html-webpack-plugin插件的使用
如果没记错,上篇的时候构建完成的js文件是我们在页面用 script 标签手动引入的, 聪明的您应该马上看出问题来了,难道每次更改输出path,都要手动更新引入链接吗?如果加上 hash防止缓存,那么一串,岂不头疼欲死。有需求就有解决方案,此款插件就是用来 将依赖自动写入html文件的。
1 | sudo cnpm i html-webpack-plugin --save-dev |
修改配置如下:
1 |
|
查看output目录,发现多了一个 index.html
1 |
|
用chrome 打开链接http://localhost:3000/output/index.html 可以看到一样的屎黄色结果
可能聪明的您又发现了一个问题,我们每次改动一句代码,哪怕更改一个字体大小,几像素留白,就要编译打包一次才能看到结果,有没有好烦呢?
webpack-dev-middleware 插件登场
1 | sudo cnpm i webpack-dev-middleware --save-dev |
此插件主要结合 express的 中间件使用,修改dev-server.js,方法如下:
1 | var express = require("express"); |
为了方便调试 和 理解什么叫 内存缓存,不写入硬盘,我们修改一点webpack配置
- 修改 output.publicPath: “/“,修改为根目录
- plugins中的filename: “index.html” ,置换到根目录然后,重启服务 node dev-server.js
1
2
3
4
5
6
7
8
9
10
11
12
13output: {
path: path.resolve(__dirname, "./output/static"), //输出路径
publicPath: '/', //调试或者 CDN 之类的域名,稍候会用到
filename: "[name].js" //配置生成的文件名
}
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html',
template: path.resolve(__dirname, './app/views/index.html'),
inject: true
})
]
打来浏览器输入: http://localhost:3000/index.html
哇塞,又看到了记忆中 屎黄色 的界面,有木有很开心,打开控制台,会看到这句代码
1 | <script type="text/javascript" src="/app.js"></script> |
惊奇的事情发生了,我们的根目录根本没有index.html 和 app.js,这些东西哪里来的呢?
这就是我们的 伟大的中间件 webpack-dev-middleware 的功劳。
然后去mountains.vue文件中修改背景色或者其他,然后刷新浏览器就能看到效果了
有木有很赞,速度还超快哦,如图改动了背景色,只需 55ms,就是快
接下来就是解放我们的双手,自动实时刷新页面.
webpack-hot-middleware 为了左手
1 | # 老套路 install |
使用步骤,参照api,很简单
- 增加插件plugins
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
plugins: [
// Webpack 1.0
new webpack.optimize.OccurenceOrderPlugin(),
// Webpack 2.0 fixed this mispelling
// new webpack.optimize.OccurrenceOrderPlugin(),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin(),
new HtmlWebpackPlugin({
filename: 'index.html',
template: path.resolve(__dirname, './app/views/index.html'),
inject: true
})
] - Add ‘webpack-hot-middleware/client’ into the entry array(添加xx到入口数组)
1
2
3
4entry: {
app: ['webpack-hot-middleware/client',path.resolve(__dirname, "./app/main.js")]
}
更好的方法是不动基本配置,稍候会在dev-server.js中 书写 - Add webpack-hot-middleware attached to the same compiler instance重新启动服务 node der-server.js
1
2# dev-server.js中 app.use(devMiddleware); 之后增加
app.use(require("webpack-hot-middleware")(compiler));
然后修改一个 body 背景,切回浏览器,哇塞,自动刷新了哦
怀着激动的心情改了一下main.js,开心的切回浏览器哇靠靠,一切都没变化,错觉?果然手动刷新, 看到了你想看到的。
你没错,是我错了,更改上面第二部的 entry参数配置如下:果然重启服务,一切ok.1
2
3
4# 增加 参数reload=true
entry: {
app: ['webpack-hot-middleware/client?noInfo=true&reload=true',path.resolve(__dirname, "./app/main.js")]
}
闲的蛋疼又去,更改了.vue文件里面的 data 数据,然后。。。。问题又来了,无热加载,控制台却能看到vue文件变化消息
查了查资料:发现这可能是vue的热加载机制和策略问题,目前我不知道怎么解决。
接下来还有一件事,那就是html模版改动的自动刷新,现在是没有这个功能的,不信你试试!
实现html模版更改自动刷新
- 更改entry注入参数方式,从dev-server.js写入,example:
1 | # webpack.config.js 恢复初始设置 |
1 | # dev-server.js |
dev-client.js 接受reload事件
1 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') |
重启服务,修改试试?不出意外,应该万事大吉了。
ok,至此,测试程序已经结束了。下篇讲解项目中的webpack配置.