Webpack 構成を最適化する方法

php中世界最好的语言
リリース: 2018-04-16 09:26:28
オリジナル
1174 人が閲覧しました

今回は、Webpack 構成を最適化する方法と、Webpack 構成を最適化するための 注意事項 について説明します。以下に実際のケースを示します。

最近のプロジェクトは忙しいインフラ構築期間を過ぎ、少しずつリラックスしてきました。過去を振り返り、新しいことを学ぶ効果を期待して、最近の Webpack 最適化対策を記録します。

プロジェクトではvueファミリーのバケットを使用しており、ビルド構成はvue-cliをベースに改良されています。元の Webpack 構成については、vue-cli#2.0 Webpack 構成分析の記事を参照してください。この記事では、基本的にファイル内のコードの各行が詳細に説明されており、Webpack をより深く理解するのに役立ちます。

慎重にまとめた結果、私の最適化は基本的にインターネット上で流通しているポイントに基づいています

  1. 外部構成を通じて共通ライブラリを抽出し、CDN を参照する

  2. CommonsChunkPlugin を適切に構成する
  3. エイリアスを有効に活用する
  4. dllplugin でプリコンパイルを有効にする
  5. happypack マルチコア ビルド プロジェクト

外部

ドキュメントのアドレス

https://doc.webpack-china.org/configuration/externals/

特定のインポートされたパッケージがバンドルにパッケージ化されるのを防ぎ、代わりに、実行時にこれらの外部依存関係を外部から取得します。

CommonsChunkプラグイン

ドキュメントアドレス https://doc.webpack-china.org/plugins/commons-chunk-plugin/

CommonsChunkPlugin プラグインは、複数のエントリ チャンクを含む独立したファイル (チャンクとも呼ばれます) を作成するためのオプション機能です。 パブリックモジュール。共通モジュールを分離することで、最終的に合成されたファイルを最初に 1 回ロードし、その後の使用のためにキャッシュに保存できます。これにより、ブラウザーは新しいページにアクセスするたびに大きなファイルをロードするのではなく、キャッシュから共通コードを迅速に取得するため、速度が向上します。

resolve.alias

ドキュメントアドレス https://doc.webpack-china.org/configuration/resolve/#resolve-alias

インポート用のエイリアスを作成するか、モジュールのインポートを簡単にする

require を作成します。たとえば、src/ フォルダーの下にあるいくつかの一般的なモジュール:

ただし、私自身の実践を通じて、最後の 3 つのポイントが私自身のプロジェクトに最も最適化されています。この記事では主に以下の点についても詳しく解説しています

プロジェクトのパッケージ化に必要な時間は基本的に約 40 秒であることがわかりました。では、次の 3 つの最適化ステップを実行するのにどれくらい時間がかかるでしょうか

1. dllplugin を使用してプリコンパイルおよび参照します

そもそもなぜ Dll を参照するのでしょうか?インターネット上の記事をいくつか閲覧したところ、webpack の dll を使用すると、ビルドの高速化に加えて、別の利点があることがわかりました。

DLL は、パッケージ化された後は、含まれるライブラリが追加、削除、またはアップグレードされない限り、独立して存在するため、バージョンのリリースに合わせてオンライン DLL コードを頻繁に更新する必要はありません。 Dll を使用してパッケージ化されたファイルは、基本的に独立したライブラリ ファイルであるため、あまり変更されないのが特徴です。通常、これらのライブラリ ファイルを app.js にパッケージ化すると、他のビジネス ファイルの変更がビルドのキャッシュの最適化に影響を与えるため、毎回 npm パッケージ内の

関連ファイルを再度検索する必要があります。 DLL を使用した後、付属のライブラリがアップグレードされていない限り、 増やしても減らしても、詰め替える必要はありません。これにより、ビルド速度も向上します。

Dll を使用してプロジェクトを最適化する方法

まず、DLL の

設定ファイル

を作成し、プロジェクトに必要なサードパーティ ライブラリを導入します。このタイプのライブラリの特徴は、バージョンのリリースに応じて頻繁に更新する必要がなく、長期的に安定していることです。 りー 基本的な設定パラメータは基本的に webpack と同じです。最適化について読んだ人なら誰でもその意味を理解できると思いますので、説明は省略します。次に、コードを実行してファイルをコンパイルします。 (私の構成ファイルはビルドに配置されており、以下のパスはプロジェクトのパスに従って変更する必要があります)

const webpack = require('webpack');
const path = require('path');
module.exports = {
 entry: {
  //你需要引入的第三方库文件
  vendor: ['vue','vuex','vue-router','element-ui','axios','echarts/lib/echarts','echarts/lib/chart/bar','echarts/lib/chart/line','echarts/lib/chart/pie',
   'echarts/lib/component/tooltip','echarts/lib/component/title','echarts/lib/component/legend','echarts/lib/component/dataZoom','echarts/lib/component/toolbox'],
 },
 output: {
  path: path.join(dirname, 'dist-[hash]'),
  filename: '[name].js',
  library: '[name]',
 },
 plugins: [
  new webpack.DllPlugin({
   path: path.join(dirname, 'dll', '[name]-manifest.json'),
   filename: '[name].js',
   name: '[name]',
  }),
 ]
};
ログイン後にコピー

実行が完了すると、ディレクトリの同じレベルに 2 つの新しいファイルが生成されます。1 つは dist フォルダーに生成された verdor.js で、もう 1 つは dll フォルダー内の verdor- です。 .manifest.json は、各ライブラリを番号でインデックス付けし、名前の代わりに ID を使用します。

接下去你只要去你的webpack配置文件的里的plugin中添加一行代码就ok了。

const manifest = require('./dll/vendor-manifest.json');
...
...,
plugin:[
  new webpack.DllReferencePlugin({
    context: dirname,
    manifest,
  }),
]
ログイン後にコピー

这时候再执行webpack命令,可以发现时间直接从40秒锐减到了20s左右,整整快了一倍有木有(不知道是不是因为自己依赖库太多了才这样的,手动捂脸)。

2.happypack多线程编译

一般node.js是单线程执行编译,而happypack则是启动node的多线程进行构建,大大提高了构建速度。使用方法也比较简单。以我项目为例,在插件中new一个新的happypack进程出来,然后再使用使用loader的地方替换成对应的id

var HappyPack = require('happypack');
...
...
modules:{
  rules : [
    ...
    {
      test: /\.js$/,
      loader:[ 'happypack/loader?id=happybabel'],
      include: [resolve('src')]
    },
    ...
  ]
},
...
...
plugin:[
  //happypack对对 url-loader,vue-loader 和 file-loader 支持度有限,会有报错,有坑。。。
  new HappyPack({
     id: 'happybabel',
     loaders: ['babel-loader'],
     threads: 4,//HappyPack 使用多少子进程来进行编译
  }),
  new HappyPack({
     id: 'scss',
     threads: 4,
     loaders: [
        'style-loader',
        'css-loader',
        'sass-loader',
     ],
  })
]
ログイン後にコピー

这时候再去执行编译webpack的代码,打印出来的console则变成了另外一种提示。而编译时间大概从20s优化到了15s左右(感觉好像没有网上说的那么大,不知道是不是因为本身js比重占据太大的缘故)。

3.善用alias

3.配合resolve,善用alias

本来是没有第三点的,只不过在搜索网上webpack优化相关文章的时候,看到用人提到把引入文件改成库提供的文件(原理我理解其实就是1.先通过resolve指定文件寻找位置,减小搜索范围;2.直接根据alias找到库提供的文件位置)。

vue-cli配置文件中提示也有提到这一点,就是下面这段代码

resolve: {
  //自动扩展文件后缀名,意味着我们require模块可以省略不写后缀名
  extensions: ['.js', '.vue', '.json'],
  //模块别名定义,方便后续直接引用别名,无须多写长长的地址
  alias: {
   'vue$': 'vue/dist/vue.esm.js',//就是这行代码,提供你直接引用文件
   '@': resolve('src'),
  }
 },
ログイン後にコピー

然后我将其他所有地方关于vue的引用都替换成了vue$之后,比如

// import 'vue';
import 'vue/dist/vue.esm.js';
ログイン後にコピー

时间竟然到了12s,也是把我吓了一跳。。。

然后我就把jquery,axios,vuex等等全部给替换掉了。。。大概优化到了9s左右,美滋滋,O(∩_∩)O~~

4.webpack3升级

本来是没第四点,刚刚看到公众号推出来一篇文章讲到升级到webpack3的一些新优点,比如Scope Hoisting(webpack2升级到webpack3基本上没有太大问题)。通过添加一个新的插件

// 2017-08-13配合最新升级的webpack3提供的新功能,可以使压缩的代码更小,运行更快
...
plugin : [
  new webpack.optimize.ModuleConcatenationPlugin(),
]
ログイン後にコピー

不过在添加这行代码之后,构建时间并没有太大变化,不过运行效率没试过,不知道新的效果怎么样

好了基本上感觉就是以上这些效果对项目的优化最大,虽然没有到网上说的那种只要3~4秒时间那么变态,不过感觉基本8,9秒的时间也可以了。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Angular 4中显示CSS样式

vue综合组件通信使用案例

以上がWebpack 構成を最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート