配置webpack4
webpack4基本配置
1、npm init
生成package.json文件
2、npm install webpack webpack-cil --save-dev
安装webpack和webpack-cli
3、新建一个src文件夹,里面创建index.js文件
console.log(123);
webpack会自动查找src下的index.js文件,将它打包到dist文件夹里,默认生成main.js,main.js就是打包后的文件
4、修改package.json
1
2
3
4
5
|
"scripts" : { "test" : "echo \"Error: no test specified\" && exit 1" , "dev" : "webpack --mode development" , // (开发模式) "build" : "webpack --mode production" // (生产模式) }, |
开发模式生成的文件不压缩
生产模式生成的文件压缩
5、运行npm run dev和npm run build
此时,根目录下就会多出dist文件夹,里面有main.js文件,可以分别运行这两个命令,看一下生成的main.js文件的区别
6、以上这些都是默认的,当然这些可以自己配置
新建webpack.config.js文件
1
2
3
4
5
6
7
8
9
|
const path = require( "path" ) module.exports = { entry: "./src/index.js" , // 入口 output: { // 出口 filename: "bundle.js" , // 生成打包文件的名字 path: path.join(__dirname, "dist" ) // 打包文件的路径,__dirname指当前根目录 } } |
此时运行npm run dev,在dist文件夹下就能看到打包生成的bundle.js文件
7、以上是单文件入口,那如果是多文件入口呐
只需修改webpack.config.js文件
1
2
3
4
5
6
7
8
9
10
|
module.exports = { entry: { // 多文件入口 index: "./src/index.js" , test: "./src/test.js" }, output: { // 出口 filename: "[name].bundle.js" , // 生成打包文件的名字 ==>注意这里,因为是多文件入口,所有需要[name]来区分文件 path: path.join(__dirname, "dist" ) // 打包文件的路径,__dirname指当前根目录 } } |
运行npm run dev
就能看到打包后的index.bundle.js和test.bundle.js文件,
entry也可以写成数组的形式
entry: ["./src/index.js", "./src/test.js"],
这个方式和对象形式结果是一样的。
将代码恢复,删除掉刚刚生成的index.bundle.js和test.bundle.js文件,以及mian.js文件
8、设置webpack-dev-server
安装 npm install webpack-dev-server --save-dev
在webpack.config.js进行配置
1
2
3
4
5
6
7
8
9
10
|
devServer: { // 设置基本目录结构 contentBase: path.join(__dirname, "dist" ), // 服务器的ip地址,也可以使用localhost host: "localhost" , // 服务端压缩是否开启 compress: true , // 配置服务端口号 port: 8080 } |
修改package.json内容为
1
2
3
4
5
6
|
"scripts" : { "test" : "echo \"Error: no test specified\" && exit 1" , "serve" : "webpack-dev-server --mode development" , "dev" : "webpack --mode development" , "build" : "webpack --mode production" }, |
运行npm run serve
成功
9、打包html文件
安装html-webpack-plugin,它能够帮我们插入script及link标签
npm install html-webpack-plugin --save-dev
src下新建index.html文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <meta name= "viewport" content= "width=device-width, initial-scale=1.0" > <meta http-equiv= "X-UA-Compatible" content= "ie=edge" > <title>Document</title> </head> <body> <div id= "main" > hello </div> </body> </html> |
在webpack.config.js中进行配置
开头引入插件
1
|
const HtmlWebpackPlugin = require( 'html-webpack-plugin' ) |
在plugins配置
1
2
3
4
5
6
7
8
|
plugins: [ new HtmlWebpackPlugin({ filename: 'index.html' , template: './src/inde.html' , // chunks: ['index'], // 多入口时需要用到 hash: true // 插入的文件后面加一段随机数 }) ], |
运行npm run serve,浏览器中打开localhost:8080
成功,此时dist文件夹下也有了index.html文件
10、打包css文件
在src下新建main.css文件
1
2
3
4
5
6
7
|
#main{ height: 100px; width: 100px; font-size: 40px; color: #FF6347;
} |
需要安装css-loader,style-loader
npm install css-loader style-loader --save-dev
webpack.config.js中配置
1
2
3
4
5
6
7
8
9
|
module: { rules:[ // css loader { test: /\.css$/, use: [ "style-loader" , "css-loader" ] // 这里顺序不能颠倒 } ] }, |
在入口文件index.js中引入mian.css文件
import main from './main.css'
// require('./main.css')
这两种引入方式都可以
npm run serve
效果有了
11、使用style-loader会将样式内嵌到HTML中,但是我们不希望这样,我们想在HTML中通过link标签的形式引入。
使用extract-text-webpack-plugin插件分离css
安装:
npm install extract-text-webpack-plugin --save-dev
webpack.config.dev中配置
1
2
3
|
new ExtractTextPlugin({ filename: "index.css" , }) |
1
2
3
4
5
6
7
8
9
10
11
|
rules:[ // css loader { test: /\.css$/, use: ExtractTextPlugin.extract({ fallback: "style-loader" , use: "css-loader" }) } ] |
然后npm run build 打包,结果报错
这是因为extract-text-webpack-plugin目前版本并不支持webpack4
所以安装最新版本
npm install extract-text-webpack-plugin@next --save-dev
再次打包
npm run build,成功,此时dist文件夹里就有了index.css文件
此时dist下的html文件中就是通过link的方式引入css的
如果在css中引入图片打包呐
12、css中引入图片
在src/index.html新加一个div,class为bg。在src/main.css中添加
1
2
3
4
5
|
.bg{ height: 50px; width: 50px; background: url( "./img/confirm.png" ) } |
npm run build 打包
报错
这是因为缺少loader,安装file-loader和url-loader
npm install file-loader url-loader --save-dev
配置:
1
2
3
4
5
6
7
8
9
10
|
// 图片 loader { test: /\.(png|jpg|gif|jpeg)/, use: [{ loader: 'url-loader' , options: { limit: 500 //是把小于500B的文件打成Base64的格式,写入JS } }] } |
npm run build 打包 ,成功
npm run serve 看下
有了
这里配置的时候只引用了url-loader,这是因为,url-loader封装了file-loader
url-loader工作分两种情况:
1.文件大小小于limit参数,url-loader将会把文件转为DataURL(Base64格式);
2.文件大小大于limit,url-loader会调用file-loader进行处理,参数也会直接传给file-loader。
也就是说,其实我们只安装一个url-loader就可以了。但是为了以后的操作方便,所以顺便安装上file-loader。
13、html中通过img引入图片
这时候css中引入图片没问题,但是在HTML文件中通过img引入图片,会有问题,打包虽然没有报错,但是页面上并没有显示图片,控制台能看到报错
这是因为打包后路径的问题。
使用html-withimg-loader来处理html引入的img图片
安装:
npm install html-withimg-loader --save-dev
配置
url-loader中添加
1
2
3
4
|
options: { limit: 500, //是把小于500B的文件打成Base64的格式,写入JS outputPath: 'images/' //打包后的图片放到images文件夹下 } |
在module中添加
1
2
3
4
|
{ test: /\.(htm|html)$/i, use: [ "html-withimg-loader" ] } |
然后npm run build,成功,但是dist文件夹中并没有生成images文件夹,这是因为设置了limit,如果引用的图片小于500k,url-loader将图片转换成base64格式写入js,引入一张大的试试,再打包
可以看到区别,1.jpg由于超过400k,所以就被打包到了dist/images中了
14、使用less
安装less:
npm install less --save-dev
打包需要less-loader,再安装less-loader:
npm install less-loader --save-dev
配置:
1
2
3
4
5
|
// less loader { test: /\.less$/, use: [ "style-loader" , "css-loader" , "less-loader" ] } |
在src文件夹下创建indexless.less文件
1
2
3
4
5
6
|
@bgColor: #FFA54F; .my{ height: 100px; width: 100px;
} |
对应的在index.html中添加class为my的div块
npm run serve,浏览器中就能看到了
15、分离出来less文件,像分离css文件一样
其实和分离css文件配置基本是一样的
1
2
3
4
5
6
7
8
9
10
|
// less loader { test: /\.less$/, use: ExtractTextPlugin.extract({ fallback: "style-loader" , use: [ "css-loader" , "less-loader" ] }), } |
这时候运行npm run build 打包
看dist文件夹下生成的index.css文件
已经生成
16、使用sass,配置大致相同
17、自动添加CSS3属性前缀
安装插件:
npm install postcss-loader autoprefixer --save-dev
在根目录下创建postcss.config.js文件
1
2
3
4
5
|
module.exports = { plugins: [ require( 'autoprefixer' ) //自动添加前缀插件 ] } |
webpack.config.js配置
1
2
3
4
5
6
7
8
9
|
// css loader { test: /\.css$/, use: ExtractTextPlugin.extract({ fallback: "style-loader" , use: [ "css-loader" , "postcss-loader" ] }) }, |
npm run build打包
看下对比