# webpack
**Repository Path**: com_hike_wang/webpack
## Basic Information
- **Project Name**: webpack
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-01-27
- **Last Updated**: 2022-02-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#
webpack学习
## 一、source-map
* 语法代码
```
config.devtool: 'inline-source-map',
```
* 作用是起到代码的映射作用如下图

## 二、资源模块
1. asset/resource
* 语法代码
```
{
test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i,
type: 'asset/resource',
},
```
* index.js文件代码
```
import imgsrc from './assets/garden.png'
const img = document.createElement('img');
img.src = imgsrc;
img.style.height = '400px';
img.style.width = '855px';
img.style.margin = '0px 255px';
document.body.appendChild(img);
```
* 生成的dist文件夹

* 资源模块输出名
* 通过配置output参数修改输出名,[name]|[contenthash],name的名字是根据entry文件入口描述的key值确定的,contenthash是根据内容自动生成hash值
```
output: {
path: path.resolve(__dirname, 'dist'),
clean: true,
assetModuleFilename: 'img/[contenthash:10][ext][query]'
},
```
* 也可以在config.module.rules中进行配置文件输出名,并且此处配置的优先级高于output中配置的
```
{
test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i,
type: 'asset/resource',
generator: {
filename: 'img/[contenthash][ext][query]'
}
},
```
2. asset/inline
* 作用是用于导出一个data:url资源,不会再生成静态资源,因此不可以设置输出名
* 语法代码
```
{
test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i,
type: 'asset/inline',
},
```
* 生成结果

3. asset/source
* 作用是导出文本文件,不会生成新的文件,不设置输出名
* 语法代码
```
{
test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif|txt)$/i,
type: 'asset/source',
},
```
4. asset会自动根据内容再resource和inline之间进行选择
---
* conslusion:

## 三、css抽离和压缩
1. 抽离css
首先,你需要安装 mini-css-extract-plugin:
```
npm install --save-dev mini-css-extract-plugin
```
建议 mini-css-extract-plugin 与 css-loader 一起使用。
之后将 loader 与 plugin 添加到你的 webpack 配置文件中。 例如:
* style.css
```
body {
background: green;
}
```
* component.js
```
import "./style.css";
```
* webpack.config.js
```
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
plugins: [new MiniCssExtractPlugin()],
module: {
rules: [
{
test: /\.css$/i,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
};
```
2. 这个插件使用 cssnano 优化和压缩 CSS
就像 optimize-css-assets-webpack-plugin 一样,但source-maps 和 assets 中使用查询字符串会更加准确,支持缓存和并发模式下运行。
* 首先,你需要安装 css-minimizer-webpack-plugin
```
npm install css-minimizer-webpack-plugin --save-dev
```
* 接着在 webpack 配置中加入该插件。示例:
```
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
module.exports = {
module: {
rules: [
{
test: /.s?css$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
},
],
},
optimization: {
minimizer: [
// 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
// `...`,
new CssMinimizerPlugin(),
],
},
plugins: [new MiniCssExtractPlugin()],
};
```
这将仅在生产环境开启 CSS 优化。如果还想在开发环境下启用 CSS 优化,请将 optimization.minimize 设置为 true:
```
module.exports = {
optimization: {
// [...]
minimize: true,
},
};
```
## 四、字体图标库
1. iconfont下载字体图标库

2. index.css
```
@font-face {
font-family: "iconfont logo";
src: url('../assets/iconfont.ttf');
src: url('../assets/iconfont.ttf') format('truetype');
}
.heart {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
color: red;
}
```
3. index.html
```
```
---
* 注意在assets文件夹中添加.ttf文件
## 五、代码分离
1. Dependencies
默认情况下,每个入口 chunk 保存了全部其用的模块(modules)。使用 dependOn 选项你可以与另一个入口 chunk 共享模块:
```
module.exports = {
//...
entry: {
app: { import: './app.js', dependOn: 'react-vendors' },
'react-vendors': ['react', 'react-dom', 'prop-types'],
},
};
```
app 这个 chunk 就不会包含 react-vendors 拥有的模块了.dependOn 选项的也可以为字符串数组:
```
module.exports = {
//...
entry: {
moment: { import: 'moment-mini', runtime: 'runtime' },
reactvendors: { import: ['react', 'react-dom'], runtime: 'runtime' },
testapp: {
import: './wwwroot/component/TestApp.tsx',
dependOn: ['reactvendors', 'moment'],
},
},
};
```
此外,你还可以使用数组为每个入口指定多个文件:
```
module.exports = {
//...
entry: {
app: { import: ['./app.js', './app2.js'], dependOn: 'react-vendors' },
'react-vendors': ['react', 'react-dom', 'prop-types'],
},
};
```
* config代码
```
entry: {
index: {
import: './src/index.js',
filename: 'javascript/[contenthash:10][name].js',
dependOn: 'shared',
},
shared: ['jquery', 'vue'],
},
```
* index.js代码
```
import $ from 'jquery'
console.log($)
import Vue from 'vue/dist/vue.js'
console.log(Vue);
```
2. 动态导入
当涉及到动态导入时,webpack推荐使用ECMAscript提案的import()方法,方法返回的promise对象。
```
function getComponent() {
return import ( /*webpackChunkName:'/javascript/jquery'*/ 'jquery')
.then(({ default: $ }) => {
return $
})
}
getComponent().then(value => {
console.log(value);
})
```
3. 懒加载
当动态导入时,通过函数导入就是懒加载
```
botton.addEvenListener('click',()=>{
import ( /*webpackChunkName:'/javascript/jquery'*/ 'jquery')
.then(({ default: $ }) => {
return $
})
})
```