webpack 上

120 阅读3分钟

CRM学webpack
webpack会转译src文件里的所有代码

配置webpack

官网有一些操作不需要做,照着本篇步骤即可

  1. 下载 webpack
mkdir webpack-demo   // 创建项目
cd webpack-demo      // 进入项目
npm init -y          
yarn add webpack@4 webpack-cli@3 --dev  // 要按这样写,否则执行yarn start或者yarn build时大概率报错。
  1. 用 webpack 转译 js

创建 src/index.js 输入 console.log('hi')

调用本地 webpack ./node_modules/.bin/webpack --versionnpx webpack

【如果node所在的路径有空格则不能使用第二种】

成功运行会出现dist/main.js,是console.log('hi') 转译的js

// 试试打印其他代码

修改 src/index.js 为 

import x from './x.js'
console.log('x')

创建 src/x.js 输入`export default 'xxx'`

运行 `npx webpack` main.js里出现 `console.log("xxx")`

说明webpack自动识别x转译为xxx,而浏览器无法直接解析exportimport代码
  1. 初始化webpack.config.js (去除warning)

创建 webpack.config.js , 看warning发现只需改mode:'development' or 'production , 复制代码后把mode后几行删除即可。

运行 npx webpack

结果:mode模式不同,main.js转译的代码也不同

  1. webpack 配置entry和output

手动转译js:将entry的文件转译到output里。

// 还是在webpack.config.js里 
const path = require('path');

module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),    // 这行不写默认解析到dist ,但是后续操作可能报错
    filename: 'main.js',    // 写成什么转译出的文件就叫什么
  },
};

hash的用途:在http协议中便于添加缓存

const path = require('path');

module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {  
    filename: '[name].[contenthash].js',    // 根据文件产生一个哈希
  },
};

要先删除dist文件再运行。为了方便直接配置json文件 , 每次运行直接yarn build

// package.json
script:{
    "build": "rm -rf dist && webpack",
}

转义的JS文件名改变,这里我们就需要理解HTTP缓存的意义。
HTTP缓存可以避免重复下载相同文件,加快访问网站速度。
但是一定要记住不能让首页index.html缓存,因为如果首页都缓存了,那么我们就无法知道其他页面是否需要更新。
当我们修改文件内容时,文件名的hash就会改变,提示我们缓存不能使用了要更新。

  1. webpack 插件自动生成 HTML

yarn add html-webpack-plugin --dev

看文档,只需添加一部分之前没有的代码即可

// webpack.config.js

const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
    plugins: [new HtmlWebpackPlugin()],
}

yarn build

学习plugin和loader部分遇到报错时,请复制老师package.json中高亮的部分,然后yarn install, 再次重试即可

如果修改index.js的代码,build以后dist里的文件会自动更新文件名

plugin documentation.里找能抄的代码

生成HTML模版:

// webpack.config.js

plugins: [
    new HtmlWebpackPlugin({
      title: "XDML - 写代码啦",              // 要改index.html的title才生效
      template: "src/assets/index.html",     // 以该路径的代码(自己写)为模版运行后在dist生成同样的模版
    }),
  ],
// src/assets/index.html

<title><%= htmlWebpackPlugin.options.title %></title>
  1. webapck 引入 CSS

yarn add css-loader --dev
yarn add style-loader --dev

看文档

// webpack.config.js
module: {
    rules: [
      {
        test: /\.css$/i,
        use: ["style-loader", "css-loader"],
      },
    ],
  },
// 创建一个x.css
body {
  background-color: red;
}
// 创建一个x.js (在原有index.js加也行)
import "./x.css"

预览地址:cd dist ; http-server . -c-1 (hs -c-1)

原理:css-loader把css读到js里,style-loader把css写到head里(style)

tips:每次预览完成后,想要继续改代码再运行,需要 cd .. 到上一级路径再使用其他命令
解决方法yarn add webpack-dev-server --dev ,如下配置,再yarn start

// webpack.config.js
devtool: 'inline-source-map',
devServer: {
  static: "./dist",
},
// package.json
script: "start": "webpack serve --open",

出现nt?http://localhost:8080 4.29 KiB {main} [built]这句话,直接在网址localhost:8080即可实时访问当前页面

  1. 使用插件提取CSS文件

webpack css extract plugin

yarn add mini-css-extract-plugin --dev

// webpack.config.js
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module: 
use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              // you can specify a publicPath here
              // by default it uses publicPath in webpackOptions.output
              publicPath: "../",
            },
          },
          "css-loader",
        ],


plugins: [
   new MiniCssExtractPlugin({
      // Options similar to the same options in webpackOptions.output
      // all options are optional
      filename: "[name].css",
      chunkFilename: "[id].css",
      ignoreOrder: false, // Enable to remove warnings about conflicting order
    }),

yarn build dist就会出现一个单独的main.css文件

将css文件名也随机生成:

uTools_1675508385275.png

  1. 使用两个 webpack config 文件

开发和生产分开用npx webpack --help

查看插件信息npm info webpack-cli

json: build: "rm -rf dist && webpack --config webpack.config.prod.js",

// 生产pro:[yarn build有缓存]
mode:production,
use: [{loader: MiniCssExtractPlugin.loader,
           options: {
             publicPath: "../",
           },
       },
     "css-loader",
     ],           
// 开发:[yarn start]
mode: develop,
use: ["style-loader", "css-loader"],

这俩文件基本一样,用base继承改造一下。 后续略