前端打包工具webpack的概念及基本使用、配置文件webpack.config.js、loader、plugins、图片资源打包、代码热更新

webpack

在这里插入图片描述

概念

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。

当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

从 webpack v4.0.0 开始,可以不用引入一个配置文件。然而,webpack 仍然还是高度可配置的。在开始前你需要先理解四个核心概念:

  1. 入口(entry)
  2. 输出(output)
  3. loader
  4. 插件(plugins)

入口(entry)

入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。

每个依赖项随即被处理,最后输出到称之为 bundles 的文件中,我们将在下一章节详细讨论这个过程。

可以通过在 webpack 配置中配置 entry 属性,来指定一个入口起点(或多个入口起点)。默认值为 ./src。

接下来我们看一个 entry 配置的最简单例子:

webpack.config.js

module.exports = {
   
  entry: './path/to/my/entry/file.js'
};

出口(output)

output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。你可以通过在配置中指定一个 output 字段,来配置这些处理过程:

webpack.config.js

const path = require('path');

module.exports = {
   
  entry: './path/to/my/entry/file.js',
  output: {
   
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js'
  }
};

在上面的示例中,我们通过 output.filename 和 output.path 属性,来告诉 webpack bundle 的名称,以及我们想要 bundle 生成(emit)到哪里。可能你想要了解在代码最上面导入的 path 模块是什么,它是一个 Node.js 核心模块,用于操作文件路径。

loader

loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。

本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。

注意,loader 能够 import 导入任何类型的模块(例如 .css 文件),这是 webpack 特有的功能,其他打包程序或任务执行器的可能并不支持。我们认为这种语言扩展是有很必要的,因为这可以使开发人员创建出更准确的依赖关系图。

在更高层面,在 webpack 的配置中 loader 有两个目标:
test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。
use 属性,表示进行转换时,应该使用哪个 loader。

webpack.config.js

const path = require('path');

const config = {
   
  output: {
   
    filename: 'my-first-webpack.bundle.js'
  },
  module: {
   
    rules: [
      {
    test: /\.txt$/, use: 'raw-loader' }
    ]
  }
};

module.exports = config;

以上配置中,对一个单独的 module 对象定义了 rules 属性,里面包含两个必须属性:test 和 use。这告诉 webpack 编译器(compiler) 如下信息:

“嘿,webpack 编译器,当你碰到「在 require()/import 语句中被解析为 ‘.txt’ 的路径」时,在你对它打包之前,先使用 raw-loader 转换一下。”

重要的是要记得,在 webpack 配置中定义 loader 时,要定义在 module.rules 中,而不是 rules。然而,在定义错误时 webpack 会给出严重的警告。为了使你受益于此,如果没有按照正确方式去做,webpack 会“给出严重的警告”

示例

例如,你可以使用 loader 告诉 webpack 加载 CSS 文件,或者将 TypeScript 转为 JavaScript。为此,首先安装相对应的 loader:

npm install --save-dev css-loader
npm install --save-dev ts-loader

然后指示 webpack 对每个 .css 使用 css-loader,以及对所有 .ts 文件使用 ts-loader:

webpack.config.js

module.exports = {
   
  module: {
   
    rules: [
      {
    test: /\.css$/, use: 'css-loader' },
      {
    test: /\.ts$/, use: 'ts-loader' }
    ]
  }
};
loader 特性
  1. loader 支持链式传递。能够对资源使用流水线(pipeline)。一组链式的 loader 将按照相反的顺序执行。loader 链中的第一个 loader 返回值给下一个 loader。在最后一个 loader,返回 webpack 所预期的JavaScript。
  2. loader 可以是同步的,也可以是异步的。
  3. loader 运行在 Node.js 中,并且能够执行任何可能的操作。
  4. loader 接收查询参数。用于对 loader 传递配置。
  5. loader 也能够使用 options对象进行配置。
  6. 除了使用 package.json 常见的 main 属性,还可以将普通的 npm 模块导出为 loader,做法是在package.json 里定义一个 loader 字段。 插件(plugin)可以为 loader 带来更多特性。
  7. loader能够产生额外的任意文件。

插件(plugins)

loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。

想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建它的一个实例。

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
const webpack = require('webpack'); // 用于访问内置插件

const config = {
   
  module: {
   
    rules: [
      {
    test: /\.txt$/, use: 'raw-loader' }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
   template: './src/index.html'})
  ]
};

module.exports = config;

模式

通过选择 development 或 production 之中的一个,来设置 mode 参数,你可以启用相应模式下的 webpack 内置的优化

module.exports = {
   
  mode: 'production'
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了优化 Vue 2 项目的打包速度,你可以对 webpack 进行一些优化配置,例如: 1. 使用 `cache-loader` 缓存 loader 执行结果,避免重复执行相同的 loader。 2. 使用 `thread-loader` 将 loader 的执行放到 worker 池中,并行执行,提高构建速度。 3. 使用 `uglifyjs-webpack-plugin` 对代码进行压缩,减小文件体积,加快网络传输速度。 4. 使用 `webpack-bundle-analyzer` 分析打包后的文件大小,找出体积较大的模块并进行优化。 在 `vue.config.js` 文件中进行配置,示例代码如下: ```js const path = require('path') const TerserPlugin = require('terser-webpack-plugin') const SpeedMeasurePlugin = require('speed-measure-webpack-plugin') const smp = new SpeedMeasurePlugin() module.exports = smp.wrap({ configureWebpack: { optimization: { minimize: true, minimizer: [ new TerserPlugin({ terserOptions: { compress: { drop_console: true, drop_debugger: true } } }) ] }, plugins: [ new webpack.LoaderOptionsPlugin({ options: { cacheDirectory: true } }), new webpack.DllReferencePlugin({ context: process.cwd(), manifest: require(path.join(__dirname, 'public/vendor/vue-manifest.json')) }) ] }, chainWebpack: config => { config.optimization.delete('splitChunks') config.module .rule('js') .use('cache-loader') .loader('cache-loader') .end() .use('thread-loader') .loader('thread-loader') .options({ workers: require('os').cpus().length - 1 }) .end() } }) ``` 这里使用了 `speed-measure-webpack-plugin` 来测量 webpack 的构建时间,以便对优化效果进行评估。同时,使用了 `terser-webpack-plugin` 对代码进行压缩,使用了 `cache-loader` 和 `thread-loader` 对 loader 进行缓存和并行执行,使用了 `DllReferencePlugin` 来分离第三方库的代码,减小打包后文件的体积,加快构建速度。 注意,以上优化配置仅供参考,具体的优化策略需要根据项目实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值