Webpack5 第二节

Webpack配置文件

在上面我们使用了npx webpack ./src/index.js -o ./dist --mode=development进行对项目的打包,但是这是否太长了。这时候我们就需要简化我们的命令行的选项,就使用到了我们的webpack配置文件。

首先我们要创建webpack.config.js

复制代码
const {resolve} = require('path')
module.exports ={
    //打包环境配置
    mode: 'development',
    //入口文件
    entry: './src/index.js',
    //输出文件
    output: {
        path: resolve(__dirname, 'dist'),
        filename: 'main.js'
    },
}

然后执行以下命令即可快速打包

复制代码
npx webpack

同时我们还可以在package.json里面添加脚本执行快速打包

添加这个命令之后,可以使用以下命令进行打包

复制代码
npm run build

自动生成HTML文件和指定模版

生成一个html模版,并添加以下内容,在浏览器上打开可以看见输出结构

那我们该怎么自动生成html文件,这时候就需要用到html-webpack-plugin插件。该插件可以生成一个html文件,并在html中加载所有打包资源,便于服务器访问。

安装插件:

复制代码
cnpm i html-webpack-plugin -D

在webpack.config.js里面的插件中添加html打包插件

复制代码
    //插件配置
    plugins: [
        new HtmlWebpackPlugin()
    ],

最后执行npm run build 发现出现了html的打包文件

指定生成html模板

复制代码
//插件配置
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html', 
            filename: 'index.html',
            title: 'webpack-demo'
        })
    ],

但是我们发现其打包的html中的title标签并没有发送改变,如果需要其title标签发送更改的话需要使用EJS语法(也就是js的模版引擎)

复制代码
<title><%=htmlWebpackPlugin.options.title%></title>

打包多个HTML页面和压缩

在html标签中编写以下内容,进行跳转设置

复制代码
<body>
  <div>小滴课堂</div>
  <a href="index.html">首页</a>
  <a href="mine.html">我的</a>
</body>

在webpack.config.js中添加这个内容

复制代码
//插件配置
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html', 
            filename: 'index.html',
            title: '首页'
        }),
        new HtmlWebpackPlugin({
            template: './src/index.html', 
            filename: 'mine.html',
            title: '我的'
        })
    ],

然后执行打包命令。

压缩

复制代码
plugins: [
  new HtmlWebpackPlugin({
    template: './src/index.html', 
    filename: 'index.html',
    title: '首页',
    minify: { 
      //压缩html
      collapseWhitespace: true,   //去掉空格
      removeComments: true,       //去掉注释
      removeAttributeQuotes: true //去掉属性引号
    }
  }),
  new HtmlWebpackPlugin({
    template: './src/index.html', 
    filename: 'mine.html',
    title: '我的',
  })
],

CSS打包原理

css-loader,可以将css代码转为js代码,并合并到打包的js文件中

style-loader,可以将包含css内容的js代码,插入到html中style标签中

安装插件

复制代码
cnpm i css-loader style-loader -D

配置打包插件

复制代码
// 模块配置
module: {
  rules: [
    // 配置多个模块规则(配置loader、解析器等选项)
    {
      // 匹配css文件
      test: /\.css$/i,
      // 指定加载器,加载顺序是从左到右或者是从下到上
      use: ['style-loader', 'css-loader'],
    },
  ],
},

CSS代码抽离成单独文件

当我们运行时候有没有相关这个问题,如果我们的css过大是不是也会减少我们项目的运行速度,这时候就需要用到mini-css-extract-plugin,其可以将js文件中抽离出来css代码,减少js文件的体积;并且当js文件比较大的时候,可以避免阻碍页面的渲染,提升渲染速度。

安装插件

复制代码
cnpm i mini-css-extract-plugin -D

配置插件

复制代码
//引入
const MiniCssExtractPlugin=require('mini-css-extract-plugin')

//loader配置(替换style-loader)
use:[MiniCssExtractPlugin.loader,'css-loader']

//实例化插件
new MiniCssExtractPlugin({
  filename:'./css/main.css'
})

打包CSS预编译语言

css预编译语言主要有三个

  1. less

    cnpm install less less-loader -D

  2. sass

    cnpm install node-sass sass-loader -D

  3. stylus

    cnpm install stylus stylus-loader -D

这次我们主要是进行less进行演示:

首先我们需要在index.js文件中引入该模块

首先在webpack配置文件中配置规则

复制代码
module: {
  rules: [
    {
      test: /\.less$/i,
      use: ['style-loader', 'css-loader', 'less-loader'],
    },
  ],
},

我们需要创建一个main.less文件

复制代码
@color:red;

html,body{
    background: @color;
}

然后更改入口文件index.js

复制代码
import './css/main.less'

对特殊CSS样式添加前缀

对于不同的浏览器有不一样的规则,所以为了兼容各个浏览器,我们需要安装一些插件方便我们在不同的浏览器上进行运行。

安装插件

复制代码
cnpm i postcss-loader autoprefixer -D

配置插件,在文件的根目录下创建一个postcss.config.js文件

复制代码
use: [
  MiniCssExtractPlugin.loader, 
  'css-loader',
  'postcss-loader'   // 处理css兼容
]

在package.json添加以下内容

复制代码
  "browserslist":[
    "last 2 version",   
    "> 1%"              
  ],

打包后出现这样的结果,加上了浏览器前缀

CSS压缩

安装插件

复制代码
cnpm i optimize-css-assets-webpack-plugin -D

在webpack.config.js中插件配置

复制代码
// 引入
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')

//配置
plugins: [
  new OptimizeCssAssetsPlugin(),
],
相关推荐
liangshanbo12156 小时前
Webpack vs Vite 底层原理高频追问的问题
前端·webpack·node.js
liangshanbo12158 小时前
面试题:AI 对话上下文超限怎么办?
面试·webpack·devops
liangshanbo12151 天前
Webpack 文件指纹面试题整理
前端·webpack·node.js
liangshanbo12151 天前
Webpack 常见 Plugin 面试题
前端·webpack·node.js
liangshanbo12151 天前
Webpack Tree Shaking 面试题整理
前端·webpack·node.js
陪我一起学编程1 天前
vue3笔记
前端·webpack·vue3·vite·脚手架·vue3笔记·组件式
liangshanbo12151 天前
Webpack的分包策略面试题
前端·webpack·node.js
liangshanbo12153 天前
面试题:如何优化 Webpack 的打包速度?
前端·webpack·node.js
晚风醉蝶4 天前
webpack 模块提取
前端·webpack·node.js·ast·逆向分析
晚风醉蝶14 天前
保姆级教程:用 AST 自动提取 webpack / rspack 打包后的模块
webpack·web逆向