Webpack 的使用

222 阅读3分钟

什么是Webpack

Webpack是一个功能很强大的打包工具,它可以将各种文件打包成适合浏览器运行的格式。

它主要做以下几个事情:

  1. 转义代码
  2. 构建 build
  3. 代码压缩
  4. 代码分析

本文以Webpack@4举例


Webpack的使用——转义JS

  1. 初始化yarn 本地安装 webpack
npm init -y
yarn add webpack webpack-cli --dev

安装完成后,webpack就在 ./node_modules/.bin/webpack 中

./node_modules/.bin/webpack --version
npx webpack

我们使用这个路径就能找到webpack(使用npx也可以,但是不够稳定)

  1. 初始化webpack.config.js

首先在根目录下创建一个 webpack.config.js,在里面写以下代码(我们也可以创建base文件,来放其共有代码,配合

const base = require('./webpack.config.base.js')

...base

package.json 中,build改为

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

来使用,这里就不做演示)

var path = require('path');

module.exports = {
  mode: 'development'
};
  1. 设置出入口(使用contenthash,方便进行http缓存更新)
module.exports = {
  //...
  entry: './src/index.js',
  //入口文件
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[contenthash].js'
    //出口文件(在dist中)
  }
};
  1. 设置build快捷方式

在package.json中设置build方法

{
  ...
  "scripts": {
    "build": "rm -rf dist && npx webpack",
    ...
  },
  ...
}

此时,运行yarn build 即可快速删除原先的dist文件,打包一个新的

yarn build
  1. 转义JS

创建一个js文件,然后执行以下命令

npx webpack

我们可以发现多了一个dist文件夹,里面有转义完成的JS文件。


Webpack的使用——转义HTML

  1. 安装html插件
 yarn add html-webpack-plugin --dev
  1. 设置webpack.config.js
var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
...
  plugins: [new HtmlWebpackPlugin()]
};
  1. 生成空html

在只有js文件时,webpack会帮我们自动生成一个空html,并链接js文件

yarn build
  1. 设置空的html
  • 设置tittle
plugins: [new HtmlWebpackPlugin(),
    {
      title: 'My App',
      //<%= htmlWebpackPlugin.options.title %> 表示使用config中的tittle
    }
  ]
  • 设置内容

创建一个assets文件夹,里面放要打包进dist/index.html的内容

  plugins: [new HtmlWebpackPlugin({
    title: 'My App',
    template: "src/assets/index.html",
    //要打包进dist/index.html的内容
  }),
  ]
  1. 转义html
yarn build

Webpack的使用——引入CSS

  1. 安装css-loader
yarn add css-loader style-loader --dev
  1. 设置config
module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ['style-loader', 'css-loader'],
      },
    ],
  },
};

以上方法会将css变成style标签放到head中,常用于开发。但一般产品发布时,都需要将css抽成文件。(使用mini css extract plugin)

  1. 安装mini-css-extract-plugin
yarn add mini-css-extract-plugin --dev
  1. 配置config(最好将mode改为production)
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
...
  plugins: [
  ...,
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash].css',
      chunkFilename: '[id].[contenthash].css',
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/i,
        use:[
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: '../',
            },
          },
          'css-loader',
        ],
        //不能与style标签的方法的use同时存在
      },
    ],
  },
};

Webpack的使用——引入SCSS

  1. 安装sass-loader 和 dart-sass
 yarn add sass-loader dart-sass --dev
  1. 配置config
module.exports = {
...,
  module: {
    rules: [
    ...,
      {
        test: /\.scss$/i,
        use: [
          'style-loader',
          'css-loader',
          {
            loader: 'sass-loader',
            options: {
              implementation: require('dart-sass'),
            },
          },
        ],
      },
    ],
  },
};

Webpack的使用——引入LESS

  1. 安装 less 和 less-loader
yarn add less --dev
yarn add less-loader --dev
  1. 配置config
module.exports = {
 ...,
  module: {
    rules: [
      ...,
      {
        test: /\.less$/,
        loader: ['style-loader', 'css-loader','less-loader', ]
      },
    ],
  },
};

Webpack的使用——引入stylus

  1. 安装stylus 和 styl-loader
yarn add stylus-loader stylus --dev
  1. 配置config
...
module.exports = {
  ...,
  module: {
    rules: [
      {
        test: /\.styl$/i,
        loader:['style-loader','css-loader','stylus-loader']
      },
      ...,
    ],
  },
};

Webpack的使用——引入image

  1. 安装file-loader
yarn add file-loader --dev
  1. 修改config
module.exports = {
 ...,
  module: {
    rules: [
      {
        test: /\.(png|jpe?g|gif)$/i,
        use: [
          {
            loader: 'file-loader',
          },
        ],
      },
      ...,
    ],
  },
};

webpack dev server

webpack dev server 类似于httpserver,可以实现代码的预览。

  1. 配置config(development模式下)
module.exports = {
  ...
  devtool: 'inline-source-map',
  devServer: {
    contentBase: './dist',
  },
  ...
};
  1. 安装webpack dev server
yarn add webpack-dev-server --dev
  1. 配置package.json
{
...
  "scripts": {
    "start": "webpack-dev-server",
  },
  ...
}

  1. 运行webpack dev server
yarn start

注意:webpack dev server 不会build ,预览时代码只是加载到内存中了。


webpack 懒加载

  1. 什么是懒加载?

懒加载是一种提高用户体验的方法,例如当用户打开网页时,网页不会加载全部的文件,只有当文件不得不被使用时,才会加载。

  1. 如何使用懒加载
btn.onclick =()=>{
  const lazy = import('./lazy.js')
  //lazy.js 中的内容需要用 export default 导出
  //使用import(),在需要的时候引入
  lazy.then((module)=>{module.default()},()=>{})
  //懒加载是一个异步promise,可以用then调用,
  //以js文件为例子,module.default就是js中的内容
}

loader 与 plugin 的区别

loader 是加载器 用来加载文件 例如:css-loader style-loader babel-loader

plugin 是插件 主要用来责加强功能 例如:mini-css-extract-plugin html-webpack-plugin