Webpack 项目的性能优化

发布于 2021-12-16 12:44:36 字数 3574 浏览 1279 评论 0

Webpack 的 Code Splitting 介绍了三种减少加载包大小的技术,可以尝试运用两种:

  • Entry Points:通过配置文件中的 entry 手动指定
  • Prevent Duplication:通过 SplitChunksPlugin 拆分 和 杜绝重复
  • Dynamic Imports:通过行内调用来拆分代码

SplitChunksPlugin

项目中已经采用第一种技术,根据页面的不同打成不同的 bundle;现在可以通过 SplitChunksPlugin 将常用的 commons 打包。

webpack.config.js

{
  optimization: {
    splitChunks: {
      chunks: 'all'
    }
  },
  output {      
    chunkFilename: '[name].bundle.js'
  }
}

可以看到的原本生成的 index.bundle.js,现在变成了 vendors~index.bundle.js + index.bundle.js。

另外需要注意的是,如果我们有两个 entry,除了生成各自的 bundle 以外(vendors~index.bundle.js 和 vendors~login.bundle.js),基于这两个 bundle 的通用部分又被抽象成了 vendors~index~login.bundle.js,需要注意依次引入,不要遗漏。如下是示例:

dist/index.html

    <script src="./vendors~index~login.bundle.js"></script>
    <script src="./vendors~index.bundle.js"></script>
    <script src="./index.bundle.js"></script>

webpack.config.js

plugins: [
    new HtmlWebpackPlugin({
      inject: false,
      filename: 'login.html',
      template: './dist/login.html',
      chunks: ["vendors~index~login", "vendors~login", "login"]
    }),
    new HtmlWebpackPlugin({
      inject: false,
      filename: 'index.html',
      template: './dist/index.html',
      chunks: ["vendors~index~login", "vendors~index", "index"]
    }),
<script src="./vendors~index~login.bundle.js"></script>
<script src="./vendors~index.bundle.js"></script>
<script src="./index.bundle.js"></script>

Routes Dynamic Imports

首先在项目的根目录新建文件 .babelrc:

{
  "plugins": ["@babel/plugin-syntax-dynamic-import"]
}

将路由都从

import AppFrame from "cp/app-frame.vue";

改成如下的写法

const AppFrame = () => import('cp/app-frame.vue');

这时候可以看到每次加载一个新组件的时候,都会请求单独的js。

按需加载 element UI

参考 element quick start 进行配置,可以将对应的 bundle 文件减小,其中 development 环境 bundle 文件大小从 7.5M 减小到 5M,production 大小从 1.2M 减小到 815KB。

pacakge-lock.json 冲突、无法被添加到 .gitignore

resolving-lockfile-conflicts

As of npm@5.7.0, these conflicts can be resolved by manually fixing any package.json conflicts, and then running npm install [--package-lock-only] again. npm will automatically resolve any conflicts for you and write a merged package lock that includes all the dependencies from both branches in a reasonable tree.

cant-make-git-stop-tracking-package-lock-json

gitignore only works for untracked files. If you have a tracked file that is also in your .gitignore, the fact that the file is tracked overrides the fact that it is also in .gitignore.

do-i-commit-the-package-lock-json-file-created-by-npm-5

Yes, package-lock.json is intended to be checked into source control. If you're using npm 5, you may see this on the command line: created a lockfile as package-lock.json. You should commit this file.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

残花月

暂无简介

0 文章
0 评论
467 人气
更多

推荐作者

qq_aHcEbj

文章 0 评论 0

寄与心

文章 0 评论 0

13545243122

文章 0 评论 0

流星番茄

文章 0 评论 0

春庭雪

文章 0 评论 0

潮男不是我

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文