1.5. html-webpack-plugin
能够将index.html自动拷贝到dist目录,并在拷贝后的 html文件中引入
bundle.js
文件
下载npm包:npm install html-webpack-plugin --save-dev
修改
webpack.config.js文件
// 添加的代码 const htmlPlugin = require('html-webpack-plugin') const path = require('path') const obj = { entry: { app: './app.js' }, output: { path: path.join(__dirname, './dist'), filename: 'bundle.js' }, module:{ loaders:[ { test: /\.less$/, loader: 'style-loader!css-loader!less-loader' }, { // 即匹配被引入到js中的图片 // 也匹配被引入到js中的css文件中使用的图片 test: /\.(jpg|jpeg|bmp|gif|png)$/, // file-loader用于将 test规则匹配到的文件与js合并在一起。 loader: 'file-loader' } ] }, // 添加的代码 plugins:[ new htmlPlugin({ // 以./index.html为模板 template: './index.html', // 生成一个为为index.html文件到dist目录 // 并且在生成的文件中引用bundle.js文件 filename: 'index.html' })] } module.exports = obj
删除dist目录,一会再重新生成
打开
cmd
执行webpack
在浏览器中打开重新生成后
dist
目录里的index.html
查看效果
1.6. 整理一下文件结构
目前来说,文件结构太乱,我们稍微整理一下(这不是必需的,只是为了看起来舒服一些)
整理后的文件结构图:
这一步,并没有做太多的事情, 仅仅是通过文件夹将不同类型的文件做了分类
不过要注意,由于调整目标结构,所有代码中的路径也需要做些许修改从
webpack.config.js
开始 将app: './app.js'
改为app: './src/js/app.js'
将template: './index.html'
改为template: './src/index.html'
然后是app.js
将require('./style.less')
改为require('../less/style.less')
最后是style.less
将
.dy { background: url(./duoyun.png); } .qg { background: url(./qing.png); } .qw { background: url(./qiwen.png); } .xue { background: url(./xue.png); } .yu { background: url(./yu.png); } .mai { background: url(./mai.png); }
改为:
.dy { background: url(../img/duoyun.png); } .qg { background: url(../img/qing.png); } .qw { background: url(../img/qiwen.png); } .xue { background: url(../img/xue.png); } .yu { background: url(../img/yu.png); } .mai { background: url(../img/mai.png); }
记得删除
./src/index.html
中对bundle.js引用的代码 最后重新打包,打开index.html查看效果 由于结果还是和之前一样,就不放上截图了!
在写代码里,如果引入的css文件中使用了图片, 就需要在webpack.config.js
中使用file-loader
来处理。 那么如果在css中引入了字体文件呢,是否也需要(是否也能)使用file-loader
来处理呢??
1.7. 处理css中的字体文件
js中引入的css文件中,如果引用字体文件,也需要使用
file-loader
来处理 通过npm 下载 bootstrap,引入它的样式,用于演示!
npm install bootstrap --save
修改 ./src/index.html
, 添加一个bootstrap风格的按钮
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>url-loader演示</title> </head> <body> <button class="btn btn-success">哈哈</button> <div class="box"> <ul> <li><i class="icon dy"></i>多云</li> <li><i class="icon qg"></i>晴</li> <li><i class="icon qw"></i>气温</li> <li><i class="icon xue"></i>雪</li> <li><i class="icon yu"></i>雨</li> <li><i class="icon mai"></i>霾</li> </ul> </div> </body> </html>
修改./js/app.js
,在代码引入bootstrap的样式
// 这里不加./前缀的话,会自动到`node_modules`目录中寻找 bootstrap require('bootstrap/css/bootstrap.css') require('../less/style.less') console.log('我是中国人,我爱自己的祖国!') console.log('我是中国人,我爱自己的祖国!')
打开
cmd
执行webpack
进行打包,发现报错:
需要修改
webpack.config.js
添加一些代码
// 添加的代码--------- const htmlPlugin = require('html-webpack-plugin') const path = require('path') const obj = { entry: { app: './src/js/app.js' }, output: { path: path.join(__dirname, './dist'), filename: 'bundle.js' }, module: { loaders: [{ test: /\.less$/, loader: 'style-loader!css-loader!less-loader' }, { // 即匹配被引入到js中的图片 // 也匹配被引入到js中的css文件中使用的图片 test: /\.(jpg|jpeg|bmp|gif|png)$/, // file-loader用于将 test规则匹配到的文件与js合并在一起。 loader: 'file-loader' }, // 添加的代码start--处理css文件和css时引用的字体文件================ { test: /\.css$/, loader: 'style-loader!css-loader' }, { test:/\.(svg|eot|ttf|woff|woff2)$/, loader: 'file-loader' } // 添加的代码end--处理css文件和css时引用的字体文件================ ] }, plugins: [ new htmlPlugin({ // 以./index.html为模板 template: './src/index.html', // 生成一个为为index.html文件到dist目录 // 并且在生成的文件中引用bundle.js文件 filename: 'index.html' }) ] } module.exports = obj
打开cmd 执行 webpack 进行打包
在浏览器中打开
dist
目录的index.html
查看效果
此时,所有的在
app.js
中被引入的资源(字体,样式,图片等), 都被生成到了dist
目录,只不过看起来感觉好像很乱似的,但是并不影响代码的执行, 对于浏览器,代码的结构并不影响执行,只需要在开发时的目录结构是清晰的就可以了。
1.7.1. 调整生成的dist目录文件结构
当然,我们也是可以做些小的调整,来让生成的代码的目录结构清晰些的 修改
webpack.config.js
中的代码file-loader
部分:
{ test: /\.(jpg|jpeg|bmp|gif|png)$/, // ?name=img/[hash].[ext]意思是: // 图片会被生成到 ./dist/img目录下,这里的dist是obj.output.path的值 // [hash] 表示是根据文件生成的唯一标识(字符串) // [ext] 表示原文件的的扩展名 loader: 'file-loader?name=img/[hash].[ext]' }, { test: /\.css$/, loader: 'style-loader!css-loader' }, { test:/\.(svg|eot|ttf|woff|woff2)$/, // 同上 loader: 'file-loader?name=fonts/[hash].[ext]' }
删除
dist
目录,在cmd
中重新执行webpack
命令
下面是重新打包后生成的
dist
目录的文件结构
看起来,结构已经清晰好多好了。
1.7.2. 再次调整生成的dist目录文件结构
还可以进一步处理,让文件名能够和原来一样, 也能避免浏览器对图片和字体文件缓存缓存
只需要对前面的webpack.config.js
里的file-loader
部分做进一步修改 修改如下:
{ // 即匹配被引入到js中的图片 // 也匹配被引入到js中的css文件中使用的图片 test: /\.(jpg|jpeg|bmp|gif|png)$/, // file-loader用于将 test规则匹配到的文件与js合并在一起。 // ?name=img/[hash].[ext]意思是: // 图片会被生成到 ./dist/img目录下,这里的dist是obj.output.path的值 // [hash] 表示是根据文件生成的唯一标识(字符串) // [ext] 表示原文件的的扩展名 // [name] 这里的[name]表示的是原文件名,表明生成到dist目录的 // 文件的文件名,和src中原来文件的文件名相同 // 例如:原来文件是: ./src/img/qing.png,就会生成到 ./dist/img/qing.png // 其实就是把文件拷贝过去了 // 最后的?[hash]表示会在css中使用图片的位置,添加一个唯标识: // 例如:原来css中代码是: background:url('../img/qing.png') // 这里加上?[hash]就会变为: // background:url('../img/qing.png?唯一标识') // 这里的唯一标识是file-loader计算生成, // 只要文件内容不变,唯一标识就不会变 loader: 'file-loader?name=img/[name].[ext]?[hash]' }, { test: /\.css$/, loader: 'style-loader!css-loader' }, { test:/\.(svg|eot|ttf|woff|woff2)$/, // 同上 loader: 'file-loader?name=fonts/[name].[ext]?[hash]' }
然后删除
dist
目录,打开cmd
,重新执行webpack
命令
执行完成之后的dist
目录结构如下:
这样看起来就清晰多了!
在浏览器中打开dist
目录的index.html
查看效果
还可以进一步优化,将一些图片转换为base64编码的形式,这样可以减少网络请求
1.8. 将小图片转换为base64编码的形式
还可以进一步优化,将一些图片转换为base64编码的形式,这样可以减少网络请求
什么?还不清楚什么是图片的base64编码? 可以写一个文章来介绍 需要用到url-loader
1.9. 将es6语法转换为es5语法
import
1.10. webpack 命令参数补充
- --progress
- 在打包里可以看到进度条:
webpack --progress
- -p
- 压缩代码:
webpack -p
- --watch/-w
- 实时监视,监视会被打包的文件的变化。一旦变化,就自动重新打包。
以上参数可以组合使用同
1.11. webpack-dev-server
在开发阶段可以用来代替
webpack
命令,wegpack
命令的参数webpack-dev-server
也能够使用
webpack-dev-server --inline --hot --open
1.11.1. --watch
在输入webpack命令时 加个这个参数
webpack --watch
-- watch会自动监视文件的变化,当文件变化后,自动重新打包