webpack笔记

93 阅读5分钟

Webpack 学习笔记:

基于node.js

创建node.js项目(blog为项目名):

mkdir blog

进入项目内

cd blog

初始化一个包管理文件(package.json)

yarn init -y
或者
 npm init -y

初始化webpack依赖文件为默认

yarn add webpack webpack-cli --dev 
或者
npm install webpack webpack-cli -g

使用vscode打开项目

code .

打开命令行终端进行打包成一个dist文件

npx webpack

首先创建webpage配置文件webpack.config.js

image-20230730014851764.png

image-20230730015151853.png

打包css文件需要使用loader插件

安装style-loader、css-loader

yarn add --dev style-loader css-loader

yarn add --dev style-loader css-loader
​
npm install style-loader css-loader --save-dev

image-20230730015425036.png

安装HTML Webpack Plugin(使用它来实现将HTML文件转换为JavaScript模块的功能)

yarn add html-webpack-plugin --dev
​
npm install html-webpack-plugin --save-dev

这个命令会将HTML Webpack插件作为开发依赖项安装到项目的node_modules目录中,并将其添加到项目的package.json文件中的devDependencies中,在构建项目时,HTML Webpack Plugin不会被安装到全局范围内,而只会被安装到项目的开发环境中。

导入工具插件

image-20230730020741124.png

进行配置:

image-20230730020934522.png

场景:

兼容低版本浏览器

在开发前端项目的时候有时候使用了新的 JavaScript 新特性要兼容低版本浏览器时用babel这个工具来转译js代码,webpack也支持相应的loader

首先安装 babel-loader、@babel/core 和 @babel/preset-env

yarn add --dev babel-loader @babel/core @babel/preset-env
​
npm install --save-dev babel-loader @babel/core @babel/preset-env

Babel-loader 是 Webpack 的一个 loader,它可以将 JavaScript 代码转换为浏览器可用的代码。具体来说,Babel-loader 可以使用 Babel 将 ES6+(ES2015+)代码转换为 ES5 或更早的代码,从而使得代码可以在浏览器中运行。

@babel/core 是 Babel 的核心库,它提供了编译时需要的各种功能,例如解析器、编译器、插件等。

@babel/preset-env 是 Babel 的一种预设,它可以根据指定的目标浏览器版本,自动配置需要的 Babel 插件和转换规则,从而使得代码可以在该浏览器中运行。

通过使用 Babel-loader、@babel/core 和 @babel/preset-env,你可以将最新的 JavaScript 语法和特性转换为浏览器可用的代码,从而使得你的代码更具有可移植性,并且可以跨多个浏览器和版本运行。

webpack.config.js配置

image-20230730015514962.png

压缩打包后js代码:

减少打包后的文件体积

安装Terser Webpack Plugin

yarn add --dev terser-webpack-plugin
​
npm install --save-dev terser-webpack-plugin

Terser Webpack Plugin 是一个 Webpack 插件,它用于压缩和混淆 JavaScript 代码。它使用 Terser 库来执行压缩和混淆操作,从而提高代码的加载速度和运行效率。

通过使用 Terser Webpack Plugin,你可以在 Webpack 构建过程中自动地对 JavaScript 代码进行压缩和混淆。这有助于减少代码的大小,从而提高页面加载速度和应用程序性能。此外,通过对代码进行混淆,还可以提高代码的可保护性,减少代码被窃取和逆向工程的风险。

webpack.config.js配置

下载完成后导入

image-20230730015901726.png

进行配置:

image-20230730015959014.png

自动打包

在开发的时候每次改动后都得手动npx webpack打包一次,在代码更改时无需刷新整个页面

安装 webpack-dev-server

yarn add  --dev webpack-dev-server
​
npm install --save-dev webpack-dev-server

通过使用 webpack-dev-server,你可以在开发过程中方便地查看和测试你的 Web 应用。它支持 hot module replacement(HMR),即在代码更改时无需刷新整个页面,只有更改的部分会动态更新。这使得开发过程更加快速和高效。

package.json配置:

image-20230730020326555.png

webpack.config.js配置

image-20230730020209028.png

webpack可视化

有时候可能需要分析一下打包后的结果,比如哪个文件比较大,然后进行下一步优化

安装webpack-bundle-analyzer

yarn add --dev webpack-bundle-analyzer  
​
npm install --save-dev webpack-bundle-analyzer

webpack-bundle-analyzer 是一个 Webpack 插件,用于分析和可视化打包后的代码大小。它提供了一个可交互的报告界面,可以帮助你了解打包后的代码哪些模块占用了最大的空间,以及代码的打包分布情况。

通过使用 webpack-bundle-analyzer,你可以更好地了解你的代码打包后的情况,找出潜在的优化点,并优化你的代码打包。它可以帮助你发现哪些模块占用了最大的空间,哪些模块是重复的,以及哪些模块可以进一步优化。这些信息有助于你优化代码的打包大小,提高应用的性能和效率。

运行npx webpack自动打开可视化界面窗口

image-20230730013131229.png

webpack.config.js配置:

导入工具插件

image-20230730020426038.png

配置:

image-20230730021630506.png

总的

webpack.config.js配置文件

//引入Node.js的核心模块path
const path = require("path");
//导入将HTML文件转换为JavaScript模块HtmlWebpackPlugin插件
const HtmlWebpackPlugin = require("html-webpack-plugin");
//导入压缩打包后的js代码工具TerserPlugin
const TerserPlugin = require("terser-webpack-plugin");
//导入可视化工具BundleAnalyzerPlugin
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
    //设置为开发模式
    mode: "development",
    //可以查看和理解编译后的代码
    devtool: "inline-source-map",
    // 入口文件
    entry: "./src/index.js",
    // 出口文件配置
    output: {
        //打包后的文件名,[name]会被自动转换为默认的main,
        //[contenthash]会每次根据文件的内容进行hash计算得出一串不重复的字符
        //这样打包的时候文件内容发生变化,[contenthash]也会发生变化
        // filename: "[name].[contenthash]",//打包成不重复文件名
        filename: "dist.js",//打包成dist.js即文件名
        path: path.resolve(__dirname, "dist"), //打包后的存放目录(存放在dist目录下)
    },
    //优化项配置:压缩js代码
    optimization: {
        //是否进行压缩
        minimize: true,
        //使用什么工具来压缩(使用TerserPlugin工具来压缩)
        minimizer: [new TerserPlugin()],
    },
    //自动打包,更新页面
    devServer: {
        //指定dist目录
        static: "./dist"
    },
    //打包html文件
    plugins: [
        new HtmlWebpackPlugin(
            { title: "博客列表" }
        ),
        //可视化分析工具(用于分析和可视化打包后的代码大小)
        new BundleAnalyzerPlugin(),
    ],
    module: {
        rules: [{//打包css样式文件
            test: /.css$/i,// 正则表达式去匹配.css文件,i表示不区分大小写
            use: ["style-loader", "css-loader"] //使用style-loader,css-loader
        },
        //打包图片文件
        {
            test: /.(jpg|png|svg|jpeg|gif)$/i,// 正则表达式去匹配.jpg等后缀文件,i表示忽略大小写
            //由于使用内置的loader
            type: "asset/resource",
        },
        //兼容低版本浏览器的loader
        {
            //匹配js扩展名的文件
            test: /.js$/,
            //忽略node_modules这个目录
            exclude: /node_modules/,
            use: {
                //使用loader配置项指定使用哪一个loader(使用babel-loader)
                loader: "babel-loader",
                //传递配置
                options: {
                    //自动转译代码
                    presets: ["@babel/preset-env"],
                }
            }
        }
        ]
    },
}