https://juejin.im/post/5adea0106fb9a07a9d6ff6de
官方文档
Webpack傻瓜式指南 https://github.com/vikingmute/webpack-for-fools
- 建议node版本8.2以上
- 在项目文件夹下执行
npm init
,生成package.json - 安装webpack和webpack-cli
npm install -D 是 npm install --save-dev 的简写,是指安装模块并保存到 package.json 的 devDependencies中,主要在开发环境中的依赖包
npm install webpack webpack-cli -D
初始打包配置文件
// webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js', // 入口文件
output: {
filename: 'bundle.js', // 打包后的文件名称
path: path.resolve('dist') // 打包后的目录,必须是绝对路径
}
}
开发环境中我们打包编译会使用npm run dev
命令,所以可以配置packae.json。
npm run build
生成环境上打包执行会生成对应的打包文件npm run dev
开发环境打包执行,由于devServer帮我们把文件放到内存中了,所以并不会输出打包后文件
执行npm run build后,就会生成dist目录
- 没有关系的但是要打包到一起去的,可以写一个数组,实现多个文件打包,打包后的文件都合成了一个
- 打包后的文件都合成了一个
const path = require('path');
module.exports = {
//entry: './src/index.js', // 入口文件
entry:{
index:'./src/index.js',
login:'./src/login.js'
},
output: {
filename:'[name].js',
path:path.resolve('dist')
}, // 出口文件
module: {}, // 处理对应模块
plugins: [], // 对应的插件
devServer: {}, // 开发服务器配置
mode: 'development' // 模式配置
}
执行npm run build后,会生成打包好的两个js文件,如图所示
- 安装html-webpack-plugin插件
npm install html-webpack-plugin -D
- 在配置文件webpack.config.js里添加引用
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { entry:{ index:'./src/index.js', login:'./src/login.js' }, output: { filename:'[name].js', path:path.resolve('dist') }, module: {}, plugins: [ new HtmlWebpackPlugin({ template:'./src/index.html', hash: true }) ], devServer: {}, mode: 'development' }
- [name]就可以将出口文件名和入口文件名一一对应
- 添加hash可以防止文件缓存,每次都会生成4位的hash串
filename:'[name][hash:4].js'
执行npm run build后,会生成html文件,如图所示
- 下载解析css样式的loader
npm install style-loader css-loader -D // 引入less文件的话,也需要安装对应的loader npm install less less-loader -D
- 配置webpack.config.js
module: { rules:[ {test:/\.css$/,use:['style-loader','css-loader']} ] }
-
test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。
-
use 属性,表示进行转换时,应该使用哪个 loader。
-
此时打包后的css文件是以行内样式style的标签写进打包后的html页面中,如果样式很多的话,我们更希望直接用link的方式引入进去,这时候需要 把css拆分出来
-
extract-text-webpack-plugin插件相信用过的人都知道它是干什么的,它的功效就在于会将打包到js里的css文件进行一个拆分
-
- 安装
// @next表示可以支持webpack4版本的插件 npm i extract-text-webpack-plugin@next -D
- 修改配置文件
执行npm run build命令,会在css文件夹里生成对应的.css文件
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require("extract-text-webpack-plugin"); const extractCSS = new ExtractTextPlugin('css/[name].css'); module.exports = { //entry: './src/index.js', // 入口文件 entry:{ index:'./src/js/index.js', login:'./src/js/login.js' }, output: { //添加hash可以防止文件缓存,每次都会生成4位的hash串 //filename:'[name][hash:4].js', filename:'[name].js', path:path.resolve(__dirname,'dist') }, // 出口文件 module: { rules:[ { test:/\.css$/, use:extractCSS.extract({ use:'css-loader' }) } ] }, plugins: [ new HtmlWebpackPlugin({ template:'./src/index.html', hash: true }), extractCSS ], // 对应的插件 devServer: {}, // 开发服务器配置 mode: 'development' // 模式配置 }
需要安装对应的文件loader
npm install file-loader url-loader -D
如果是在css文件里引入的如背景图之类的图片,就需要指定一下相对路径
module: {
rules:[
{
test:/\.css$/,
//use:extractCSS.extract(['style-loader','css-loader']),
use:extractCSS.extract({
use:'css-loader',
publicPath: '../' //解决css背景图的路径问题
})
},
{
test:/\.(jpe?g|png|gif)$/,
use:[
{
loader:'url-loader',
options:{
limit:8192,
outputPath:'images/'
}
}
]
}
]
}
limit
小于对应值的图片自动转成base64格式,单位kb,并且不会存在实体图片outputPath
图片打包后存放的目录
在css中指定了publicPath路径这样就可以根据相对路径引用到图片资源了,如下图所示
页面中经常会用到img标签,img引用的图片地址也需要一个loader
npm install html-withimg-loader -D
{
test: /\.(htm|html)$/,
use: 'html-withimg-loader'
}
我们在大量的使用着ES6及之后的api去写代码,由于低版本浏览器的存在,不得不需要转换成兼容的代码,于是就有了常用的Babel。
-
安装Babel
npm install babel-core babel-loader babel-preset-env babel-preset-stage-0 -D
{ test:/\.js$/, use:'babel-loader', include:'/src/', // // 只转化src目录下的js }
在我们每次npm run build的时候都会在dist目录下创建很多打好的包,如果积累过多可能也会混乱
所以应该在每次打包之前将dist目录下的文件都清空,然后再把打好包的文件放进去
这里提供一个clean-webpack-plugin插件
npm install clean-webpack-plugin -D
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
plugins: [
// 打包前先清空
new CleanWebpackPlugin('dist')
]
}
启动一个静态服务器,默认会自动刷新,就是说你对html,css,js文件做了修改并保存后,浏览器会默认刷新一次展现修改后的效果。
执行npm run dev命令后,会启动静态服务器,我们访问localhost:3000端口就可以看到开发的页面内容了。
如果devServer里open设为true后,会自动打开浏览器
module.exports = {
devServer: {
contentBase: './dist',
host: 'localhost',
port: 3000,
open: true,
hot: true //开启热更新
}
}
当然在npm run dev命令下,打包的文件存在于内存中,并不会产生在dist目录下
热更新和自动刷新的区别
在webpack的配置中,resolve我们常用来配置别名和省略后缀名
module.exports = {
resolve: {
// 别名
alias: {
$: './src/jquery.js'
},
// 省略后缀
extensions: ['.js', '.json', '.css']
},
}
这个配置在webpack中比较简单