# webpack_demo **Repository Path**: one_pic/webpack_demo ## Basic Information - **Project Name**: webpack_demo - **Description**: webpack_demo 学习webpack 记录 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-02 - **Last Updated**: 2022-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: webpack ## README # webpack_demo webpack 官方指南 地址:https://webpack.docschina.org/guides/getting-started/ # 基本安装 ```sh npm init -y npm install webpack webpack-cli --save-dev ``` # 创建一个 bundle ```sh npm install --save lodash npx webpack ``` # 使用一个配置文件 ```sh touch webpack.config.js npx webpack --config webpack.config.js ``` # npm scripts ```sh npm run build ``` # 加载 CSS ```sh npm install --save-dev style-loader css-loader ``` # 加载 images 图像 在 webpack 5 中,可以使用内置的 Asset Modules ```javascript module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], }, { test: /\.(png|svg|jpg|jpeg|gif)$/i, type: 'asset/resource', }, ], }, ``` # 加载 fonts 字体 使用内置的 Asset Modules来处理字体文件 后缀名为.ttf的字体的format()不是ttf,而是 truetype ```javascript module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], }, { test: /\.(png|svg|jpg|jpeg|gif)$/i, type: 'asset/resource', }, { test: /\.(woff|woff2|eot|ttf|otf)$/i, type: 'asset/resource', }, ] }, ``` # 加载数据 导入 CSV、TSV 和 XML,你可以使用 csv-loader 和 xml-loader ```sh npm install --save-dev csv-loader xml-loader ``` loader ```javascript module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], }, { test: /\.(png|svg|jpg|jpeg|gif)$/i, type: 'asset/resource', }, { test: /\.(woff|woff2|eot|ttf|otf)$/i, type: 'asset/resource', }, { test: /\.(csv|tsv)$/i, use: ['csv-loader'], }, { test: /\.xml$/i, use: ['xml-loader'], }, ] }, ``` # 自定义 JSON 模块 parser 安装 toml,yamljs 和 json5 的 packages: ```sh npm install toml yamljs json5 --save-dev ``` 在webpack.config.js中进行配置 ```javascript const path = require('path'); const toml = require('toml'); const yaml = require('yamljs'); const json5 = require('json5'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), }, module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], }, { test: /\.(png|svg|jpg|jpeg|gif)$/i, type: 'asset/resource', }, { test: /\.(woff|woff2|eot|ttf|otf)$/i, type: 'asset/resource', }, { test: /\.(csv|tsv)$/i, use: ['csv-loader'], }, { test: /\.xml$/i, use: ['xml-loader'], }, { test: /\.toml$/i, type: 'json', parser: { parse: toml.parse, }, }, { test: /\.yaml$/i, type: 'json', parser: { parse: yaml.parse, }, }, { test: /\.json5$/i, type: 'json', parser: { parse: json5.parse, }, }, ], }, }; ``` # 回退处理 做一些清理工作: ```sh npm uninstall css-loader csv-loader json5 style-loader toml xml-loader yamljs ``` # 设置 HtmlWebpackPlugin 安装插件 ```sh npm install --save-dev html-webpack-plugin ``` 配置 ```javascript plugins: [ new HtmlWebpackPlugin({ title: '管理输出', }), ], ``` # 清理 /dist 文件夹 在每次构建前清理 /dist 文件夹 配置 ```javascript output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist'), clean: true, }, ``` # 使用 source map 为了更容易地追踪 error 和 warning,JavaScript 提供了 source maps 功能,可以将编译后的代码映射回原始源代码。 配置 ```javascript module.exports = { devtool: 'inline-source-map', } ``` # 使用 webpack-dev-server webpack-dev-server 为你提供了一个基本的 web server,并且具有 live reloading(实时重新加载) 功能 ```sh npm install --save-dev webpack-dev-server ``` 修改配置文件,告知 dev server,从什么位置查找文件 配置 ```javascript module.exports = { devServer: { contentBase: './dist', }, } ``` # 使用 webpack-dev-middleware 安装 express 和 webpack-dev-middleware ```sh npm install --save-dev express webpack-dev-middleware ``` 修改配置文件 ```javascript module.exports = { output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist'), clean: true, publicPath: '/', }, } ``` # bundle 分析 Install ```sh # NPM npm install --save-dev webpack-bundle-analyzer # Yarn yarn add -D webpack-bundle-analyzer ``` Usage (as a plugin) ```javascript const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = { plugins: [ new BundleAnalyzerPlugin() ] } ``` # 懒加载 注意当调用 ES6 模块的 import() 方法(引入模块)时,必须指向模块的 .default 值,因为它才是 promise 被处理后返回的实际的 module 对象。 核心代码 ```javascript button.onclick = e => import(/* webpackChunkName: "print" */ './print').then(module => { const print = module.default; print(); }); ``` # 细粒度 Shimming 通过使用 imports-loader 覆盖 this 指向 安装 imports-loader ```sh npm install imports-loader --save-dev ``` webpack.config.js ```javascript module: { rules: [ { test: require.resolve('./src/index.js'), use: 'imports-loader?wrapper=window', }, ], }, ``` # 全局 Exports 使用 exports-loader,将一个全局变量作为一个普通的模块来导出。 ```sh npm install exports-loader --save-dev ``` webpack.config.js ```javascript module: { rules: [ { test: require.resolve('./src/index.js'), use: 'imports-loader?wrapper=window', }, { test: require.resolve('./src/globals.js'), use: 'exports-loader?type=commonjs&exports=file,multiple|helpers.parse|parse', }, ], }, ```