首页前端构建工具webpack

webpack

分类前端构建工具时间2024-03-11 14:38:28发布RustStream浏览110
摘要:webpack打包构建流程 前端开发有很多资源, img,css,js,font,ts 有一些资源需要进行处理 ts js css html html-webpack-plugin 对输出产物进行优化 optimization splitChunkPlugin 所有文件资源都会被打包成一个文件,为了解决这一问题,提出了分chunk、css 提取 输出产物 核心模块 webpack-cli webpack构建工具脚手架 webpack webpack构建工具 webpack-dev-server 能自动编译并刷新浏览器,支持热模块替换(HMR)...

webpack打包构建流程

  1. 前端开发有很多资源, img,css,js,font,ts
  2. 有一些资源需要进行处理
    • ts
    • js
    • css
    • html html-webpack-plugin
  3. 对输出产物进行优化
    • optimization
    • splitChunkPlugin
      所有文件资源都会被打包成一个文件,为了解决这一问题,提出了分chunk、css 提取
  4. 输出产物

核心模块

  • webpack-cli webpack构建工具脚手架
  • webpack webpack构建工具
  • webpack-dev-server 能自动编译并刷新浏览器,支持热模块替换(HMR)

    通过在webpack配置中添加devServer对象,设置host和port等参数,可以实现代码保存时自动打包和运行。

const path = require("path");
module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "js/main.js", // 将 js 文件输出到 static/js 目录中
  },
  module: {
    rules: [],
  },
  plugins: [],
  // 开发服务器
  devServer: {
    host: "localhost", // 启动服务器域名
    port: "3000", // 启动服务器端口号
    open: true, // 是否自动打开浏览器
    proxy:{ 	// 配置代理
        '/api': {
            target: 'http://localhoust:9000',
            pathRewrite: {'/api': '/'}
        }
    }  
  },
  mode: "development",
};

Webpack 初始化操作

1. 初始化配置文件
    ·entry
    ·output
    ·module
    ·loader
    ·plugins
2. 初始化compiler对象
    compiler compilation
3. 挂载插件
    webpack最核心内容, tapable实现,里面有 tap、run方法

入口解析工作

- entry
    1. 单文件入口 (使用字符串形式)
    2. 多文件入口 (使用数组形式)
    3. 指定入口文件 (使用对象形式配置)
- 解析依赖   生成依赖图
- 模块处理 module   (对应的文件使用对应的loader来处理)
    1. ts   ts-loader
    2. js   babel-lader
    3. css  css-loader、style-loader
    4. img  image-webpack-loader、file-loader、url-loader
    5. 处理.xxx文件,  xxx-loader (自定义loader、plugin)

module.exports = {
    module: {
        rules: [
            {
                test: 'js'  // 正则匹配对应文件
                use: ['cache-loader','babel-loader']
            },
            {
                test: /ts/,
                use: ['ts-loader']
            },
            ...
        ]
    }
}
- 生成 chunk

优化

- 模块去重合并
- 代码压缩,esbuild、terser
- tree-shaking(树摇) 把未使用的内容,代码模块去掉

资源输出

  • 根据配置里面给到的output输出资源
  • 写入文件系统 fs操作

热更新(HMR)

  • 文件变化监听
  • 局部模块更新
    会开一个ws服务

工作中常用的loader与plugin,实现过哪些loader、plugin

常用loader

1. style-loader、css-loader、sass-loader、scss-loader
    · css-loader负责将.css文件进行解析,但并不会讲解析后的css插入到页面中
    · style-loader : 完成页面插入css操作
2. babel-loader
    · babel可以用来转换,但是是通过具体的babel插件来完成的,所以我们不仅要下载babel,也需要下载你所需要的对应的插件
    npm install babel-loader @babel/core @babel/preset-env -D
    支持TS文件转换需要另外安装 @babel/preset-typescript
    
3. url-loader、file-loader (处理图片文件两种方式)
    · file-loader会将文件输出到指定的输出目录,并返回文件的URL地址。

    · url-loader则会将小于指定阈值的文件转换为Base64格式的字符串,将其嵌入到JS或CSS代码中,以减少HTTP请求的数量。而对于大于指定阈值的文件,url-loader则会将其输出到指定的输出目录,并返回文件的URL地址。
4. image-webpack-loader  压缩图片
5. ts-loader  处理TS文件
6. cache-loader   文件缓存

常见plugin

1. html-webpack-plugin 处理Html文件 开启minify配置启动压缩
2. miniCssExtractPlugin 单独把Css文件抽取出来
3. css-minimizer-webpack-plugin 压缩CSS文件
4. TerserWebpackPlugin  JS代码压缩
5. image-webpack-loader 图片压缩
6. splitChunksPlugin    webpack内置插件,用于分包
7. hard-source-webpack-plugin   webpack缓存插件,功能类似于webpack5内置的缓存

自定义loader、plugin

loader的本质是函数

自定义loader是用来针对性的处理某些文件

// 自定义loader  针对 .xiagao 文件进行处理
module.exports = function(source){
    console.log('cust-loader', source);
    source = source.replace(/custFile/, '自定义文件')
    return source;
}

// webpack.config.js
module: {
        rules: [
            {
                test: /\/.css$/,
                // loader执行遵循从右往左,从下往上执行
                // loader: 'css-loader',  简写模式
                // use: ['style-loader', 'css-loader'],  多个loader,但不需要配置
                // loader需要配置时
                // use: [
                //     'style-loader',
                //     'css-loader',
                //     {
                //         loader: 'postcss-loader',
                //         options: {
                //             plugins: ['autoprefixer']
                //         }
                //     }
                // ],
            },
            {
                test: /\.xiagao/,
                use: {
                    loader: path.resolve(__dirname, './loaders/cust-loader.js')
                }
            }
        ]
    },
plugin的本质是类
module.exports = class custPlugin{
    constructor(){}

    // 默认第一个参数就是compiler
    apply(compiler){
        // console.log('cust-plugin', compiler)


        // 
        compiler.hooks.emit.tap('custPlugin', (compilation) => {
            // compilation.assets  打包构建的产物
            console.log('custPlugin', compilation.assets)
        })
    }    
}

// webpack.config.js
plugins: [
    new HtmlWebpackPlugin(),  
    new custPlugin(),
]

本文链接:https://blog.smallhao.fun/?id=15 转载需授权!

分享到:

Chen’Blog版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

Webpack
柯里化函数 Canvas添加水印

游客 回复需填写必要信息
召唤伊斯特瓦尔