webpack超详细,超规范,超炫酷

文章介绍了Webpack在现代Web开发中的作用,包括模块化、命令式和配置式使用方法,Loader和Plugins的应用,以及如何配置devServer、开发环境与生产环境、优化策略如OneOf、Include/Exclude、SourceMap、Babel缓存和webpack-bundle-analyzer。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

webpack使用原因

现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的 JavaScript 代码和一大堆依赖包。为 了简化开发的复杂度,前端社区涌现出了很多好的实践方法
1、模块化 ,让我们可以把复杂的程序细化为小的文件 ;
这些改进确实大大的提高了我们的开发效率,但是利用它们开发的文件往往需要进行额外的处理才能让 浏览器识别, 而手动处理又是非常繁琐的,这就为 WebPack 类的工具的出现提供了需求。

什么是webpack?

WebPack 可以看做是模块打包机,分析你的项目,可以看做是给各个模块打包压缩的, 并将其转换和打包为合适的格式供浏览器 使用

webpack使用方式

1、命令式

1、运行cmd命令

npm init  //初始化项目

  2、首先把项目初始化一遍,方便之后的配置

npm i webpack webpack-cli -D//安装webpack依赖

这里有个点需要注意一下 ,这个webpack只能是安装在项目中,不可安装在全局的环境变量中,

3、打包文件直接使用下面的命令

webpack ./src/app.js//这里的文件路径可以替换为自己真实的路径

4、如果上面的命令使用不了的话,还有备选方案

npx webpack ./src/app.js//这里和上面同理

2、接着就是配置式的方式

上面命令式的使用 webpack 需要手动的输入参数来告知 webpack 的打包环境,需要打包的文件等,这 样每次打包都要输入很长的命令,非常麻烦。在项目根目录新增一个 webpack.config.js
module.exports = {
entry: './src/app.js', // 需要打包的文件
mode: 'development' // 打包环境
}
//这个是写在webpack.config.js里面的
npx webpack --config ./webpack.config.js//这里运行的命令可以换成这个

3、基本配置

entry 表示 webpack 的入口,指定打包的文件,可以一个或多个。
output 表示输出文件的路径和文件名。
mode 表示打包环境,可设置 production(生产环境)  development(开发模式)  值。
const path = require('path')
module.exports = {
entry: './src/app.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'main.js',
clean: true
},
mode: 'development'
}

4、Loader部分

webpack Loader 主要用于对模块的转换,也就是对文件的转化,如将 Less Sass 处理成 CSS ,将图 片处理成 data URL

首先,是loader在配置中的格式

module.exports = {
...
module: {
rules: []
}
}
4.1 处理 CSS
需要借助 Loader 或者 Plugins ,处理 CSS 需要用到 css-loader style-loader ,不管是 Loader 还是 Plugins 都是 JS 模块,所以需要安装
这里安装的命令是处理css的依赖
pnpm i css-loader style-loader -D

下面是配置的中的代码

const path = require('path')
module.exports = {
entry: './src/app.js',//这里是需要打包的文件
output: {
path: path.resolve(__dirname, 'dist'),//这里是打包的文件名
filename: 'main.js',打包的文件名是,可修改
},
mode: 'production',//开发者模式
module: {
rules: [
// 新增的loader
{
test: /\.css$/,//这里是用了正则表达式来匹配后缀为css的文件
use: ['style-loader', 'css-loader'],//style-loader设置css文件, css-loader解析了css文件
},
],
},
}
4.2处理 SassLess

1、这里是安装的依赖

pnpm i less less-loader sass sass-loader -D

2、这里是在webpack.config.js里面新增配置

      //这里是处理less配置
       {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader"],
      },
       //这里是处理sass和scss的配置
      {
        test: /\.s[ac]ss$/,
        use: ["style-loader", "css-loader", "sass-loader"],
      },
4.3处理图片

1、这里是在webpack.config.js里面新增配置

{
test: /\.(png|jpe?g|gif|svg|webp)$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 200 * 1024
}
}
}
4.4处理字体图标

1、这里是在webpack.config.js里面新增配置

{
test: /\.(ttf|woff|woff2)$/,
type: 'asset/resource',
generator: {
filename: 'static/font/[hash][ext][query]'
}
}
4.5处理 CSS 兼容性

1、安装所需的依赖

pnpm i postcss-loader postcss postcss-preset-env -D

2、在配置文件中增加配置

{
"name": "webpack_demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "webpack --config ./webpack.config.js"
},
"author": "",
"license": "ISC",
"devDependencies": {
},
"browserslist": ["ie >= 7"]
}

4.5处理 js 兼容性

1、安装所需依赖

pnpm i babel-loader @babel/core @babel/preset-env -D

2、新增配置

{
test: /\.js$/,
exclude: /node_modules/,
use: ['babel-loader']
}

5、Plugin

webpack 的插件主要在 plugins 字段上,是个数组,也就是可以使用多个插件,每个插件在使用的时候都必须传入一个 new 实例
5.1自动引入JS CSS

引入依赖

pnpm i html-webpack-plugin -D
修改配置项
// webpack.config.js
 
module.exports = {
  entry: {
    app: './src/index.js',
    styles: './src/styles.css',
  },
  //其他配置项
};

6、devserver

devserver 可以在本地启动一个服务,使我们可以使用 http 协议去访问 index.html ,并且当修改码
时,能够监听当前项目的文件变动从而实现自动打包,而不用每次修改后都要手动打包:
devServer{
    host:"localhost",
    open:true,//是否自动打开
    port:3000//端口
}

上面的配置加到你的webpack配置就可以实现自动打包了,同时webpack打包也需要一个关键的参数才能调用这个参数就是serve,这个也是必须安装的依赖,这里是用pnpm安装的,这里可以更换其他的包管理工具,但记住你的项目中只能用一种包管理工具,如果混用的话,最后这个错误会导致项目中重构

pnpm i webpack-dev-server -D

7、开发环境和生产环境

webpack 配置是有 development production 区分的,在开发环境下,通过 devserver 启动,就不会生成 dist 文件夹,而生产模式下又恰恰需要,所以我们就要在webpack配置中去配置
config.mode=process.env.NODE.ENV
if(config.mode==="development"){
config.devServer={
host:"localhost",
open:"true",
port:3000

webpack的优化

1、OneOf

oneOf 的作用是可以减少匹配 loader 的时间,因为使用了 OneOf ,当匹配到某一个规则时,只使用第一个
// webpack.config.js
 
module.exports = {
  module: {
    rules: [
      {
        oneOf: [
          {
            test: /\.css$/,
            use: ['style-loader', 'css-loader'],
          },
          {
            test: /\.scss$/,
            use: ['style-loader', 'css-loader', 'sass-loader'],
          },
          //OneOf配置内的其他规则
        ],
      },
    ],
  },
};

2、include/Exclude

Include/Exclude 的作用就顾名思义了,可以指定处理文件时,只包含哪些文件或者排除哪些文件,两者不能同时使用。
// webpack.config.js
 
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
        },
      },
      //具有包含和排除配置的其他规则
    ],
  },
};

3、SourceMap

sourcemap 可以在打包后增强代码调试,因为打包后的代码是压缩过的,当代码报错时就会提示错误的位置。sourcemap 会影响打包的速度
// webpack.config.js
 
module.exports = {
  devtool: 'source-map',
  //其他配置项
};

4、Babel缓存

Babel 缓存同样可以提升代码打包速度, Babel 的缓存可以在第一次打包时将转换过的代码缓存起来,下次再进行打包时就可以避免部分代码的再次转换,从而提升打包速度
// webpack.config.js
 
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            cacheDirectory: true,
          },
        },
      },
      //具有缓存配置的其他规则
    ],
  },
};

5、优化构建结果

借助插件 webpack-bundle-analyzer 我们可以直观的看到打包结果中,文件的体积大小、各模块依赖关系、文件是够重复等问题,极大的方便我们在进行项目优化的时候,进行问题诊断
所以就要下依赖包了
pnpm i -D webpack-bundle-analyzer

修改配置项

const BundleAnalyzerPlugin = require('webpack-bundleanalyzer').BundleAnalyzerPlugin
const config = {
// ...
plugins:[
// ...
// 配置插件
new BundleAnalyzerPlugin({
// analyzerMode: 'disabled', // 不启动展示打包报告的http服务器
// generateStatsFile: true, // 是否生成stats.json文件
})
],
};

总结

通过上述内容,你可以更全面地了解到 Webpack 在实际项目中的应用。它可以帮助你完成快速搭建本地开发环境、优化生产环境构建等任务、以及上面提到的注意点。希望这些信息能够帮助到你,提高项目的开发效率和性能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值