学习webpack常用配置总结

105 阅读1分钟

概念

webpack是一个现代 JavaScript 应用程序的静态模块打包器

安装

前提条件
在开始之前,请确保安装了Node.js的最新版本使用Node.js 最新的长期支持版本
本地安装
安装最新版本执行命令
npm install --save-dev webpack或npm install --save-dev webpack@<version>

使用 webpack 4+ 版本,你还需要安装 CLI。
npm install --save-dev webpack-cli
全局安装
npm install --global webpack

起步

基本安装
初始化npm   然后 在本地安装 webpack,接着安装 webpack-cli
npm init -y
npm install webpack webpack-cli --save-dev

创建以下目录结构、文件和内容:
 webpack-demo
    package.json
    dist
        index.html
    src
        index.js

src/index.js

import _ from 'lodash';
function component() {
    var element = document.createElement('div');

    // lodash 在当前 script 中使用 import 引入
    element.innerHTML = _.join(['Hello', 'webpack'], ' ');
    return element;
}
document.body.appendChild(component());

dist/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./main.js"></script>
</head>
<body>
</body>
</html>

package.json

{
  "name": "webpackstart",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^5.74.0",
    "webpack-cli": "^4.10.0"
  },
  "dependencies": {
    "lodash": "^4.17.21"
  }
}

webpack.config.js

const path = require('path');

module.exports = {
  entry: './src/index.js',//入口 默认
  output: {
    filename: 'main.js',//文件名字 默认
    path: path.resolve(__dirname, 'dist'),//出口 默认
  },
};
打包
执行npm run build命令 会以src/index.js作为入口起点,也会生成 dist/main.js作为输出。

管理资源

加载css
安装 style-loader 和 css-loader
npm install --save-dev style-loader css-loader
module:{
    rules:[
      {
        test:/\.css$/i, //匹配已.css结尾的文件
        use:['style-loader','css-loader']//模块 loader 可以链式调用。链中的每个 loader 都将对资源进行转换。链会逆序执行。
      }
    ]
}
加载less
安装 less 和 less-loader
npm install less less-loader --save-dev
module: {
    rules: [
      {
        test: /\.less$/i,
        use: [
          // compiles Less to CSS
          'style-loader',
          'css-loader',
          'less-loader',
        ],
      },
    ],
},
加载图片资源
使用内置的 Asset Modules
module:{
    rules:[
      {
        test: /\.(png|svg|jpg|jpeg|gif)$/i,
        type: 'asset/resource',//使用内置asset/resource模块加载
      },
    ]
}
asset module type
    asset/resource 发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现。
    asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。
使用 Babel 和 webpack 转译 JavaScript 文件。
安装
npm install -D babel-loader @babel/core @babel/preset-env
在rules加
{
    test: /\.m?js$/,
    exclude: /(node_modules|bower_components)/,//忽略文件夹
    use: {
      loader: 'babel-loader',
      //使用options向loader传递数据
      options: {
        presets: ['@babel/preset-env']//配置多个presets
      }
    } 
}
或者在rules加
{
    test: /\.m?js$/,
    exclude: /(node_modules|bower_components)/,//忽略文件夹
    loader: 'babel-loader',
}
写一个babel配置文件
babel.config.js
module.exports = {
    presets: ['@babel/preset-env']//配置多个presets
}

管理输出

设置htmlwebpackplugin
生成html模板
安装 npm install --save-dev html-webpack-plugin
const HtmlWebpackPlugin = require('html-webpack-plugin');//引入plugin
使用
不用模板
plugins:[new HtmlWebpackPlugin({title:'管理输出'})]//数组
使用模板
new HtmlWebpackPlugin(
{title: '管理输出',
filename: 'assets/admin.html',//输出文件目录和名字
template: './src/public/index.html',//模板文件
})

const { DefinePlugin } = require('webpack') //定义变量在template中使用
const BASE_URL = "'js'"
new DefinePlugin({
  BASE_URL
})
清理 /dist 文件夹
output: {
    clean: true,//打包时清除dist文件
},

开发环境

使用source map
mode 设置为 'development'
mode:'development',//开发环境
为了更容易地追踪 error 和 warning,JavaScript 提供了 source maps 功能,可以将编译后的代码映射回原始源代码。如果一个错误来自于 b.js,source map 就会明确的告诉你。
devtool: 'inline-source-map',

选择一个开发工具
webpack 提供几种可选方式,帮助你在代码发生变化后自动编译代码:

webpack's Watch Mode
webpack-dev-server
webpack-dev-middleware

你可以指示 webpack "watch" 依赖图中所有文件的更改。如果其中一个文件被更新,代码将被重新编译,所以你不必再去手动运行整个构建。

"watch": "webpack --watch",
唯一的缺点是,为了看到修改后的实际效果,你需要刷新浏览器。如果能够自动刷新浏览器就更好了,因此接下来我们会尝试通过 webpack-dev-server 实现此功能。

使用 webpack-dev-server
安装
npm install --save-dev webpack-dev-server

添加一个可以直接运行 dev server 的 script:
"start": "webpack serve --open",

常见配置
devServer: {
    static: './dist/public',//从什么位置查找
    port: 8888,//端口
    hot: true,//启用热替换特性
    compress: true,//开启gzip压缩
    proxy: {//代理
      '/api': {
        target: 'http://localhost:3000',
        pathRewrite: { '^/api': '' },
      },
    },
},

使用vue

了解vue的版本
npm install vue --save 后
在node_modules\vue\dist中

vue(runtime).global(prod).js
    runtime版本不包含compiler
    prod版本会压缩源代码
vue(runtime).esm-browser(prod).js
    通过原生esmodule使用
    <script type="module" ></script>
    
vue(runtime)ems-bundler.js
    用于webpack等构建工具
    默认是vue.runtime.ems-bundler.js
    要解析template 需要更改为vue.ems-bundler.js

vue.cjs(prod).js
    服务端渲染使用
    通过require()在nodejs中使用
使用.vue文件
安装npm install -D vue-loader vue-template-compiler
// webpack.config.js
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
  module: {
    rules: [
      // ... 其它规则
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ]
  },
  plugins: [
    // 请确保引入这个插件!
    new VueLoaderPlugin()
  ]
}

webpack默认值

常用配置
webpack.config.js
const path = require('path');

module.exports = {
  //...
  //这些选项能设置模块如何被解析。webpack 提供合理的默认值,但是还是可能会修改一些解析的细节。
  resolve: {
    extensions: ['.js', '.json', '.wasm'],//添加查找后缀
    //别名
    alias: {
      Utilities: path.resolve(__dirname, 'src/utilities/'),
      Templates: path.resolve(__dirname, 'src/templates/'),
    },
  },
};