ここで、vue-cli webpack2 プロジェクトのパッケージ化の最適化に関する記事を共有します。これは非常に参考になるので、皆さんのお役に立てれば幸いです。
ファイルの検索範囲を減らす
resolve.modulesを設定する
Webpackのresolve.modulesは、jsにインポート「vue」が表示される場合、これは相対的なものではありません。または、絶対パスが記述されていない場合は、node_modules ディレクトリにあります。ただし、デフォルトの設定は上向きの再帰検索によって見つかりますが、通常、プロジェクト ディレクトリには node_modules が 1 つだけあり、それはプロジェクトのルート ディレクトリにあります。検索範囲を減らすために、そのフル パスを直接指定できます。同様に、エイリアスの場合も同様です (同じことが `alias の設定にも当てはまります):
function resolve (dir) { return path.join(__dirname, '..', dir) } module.exports = { resolve: { extensions: ['.js', '.vue', '.json'], modules: [ resolve('src'), resolve('node_modules') ], alias: { 'vue$': 'vue/dist/vue.common.js', 'src': resolve('src'), 'assets': resolve('src/assets'), 'components': resolve('src/components'), // ... 'store': resolve('src/store') } }, ... }
テストと包含と除外を適切に設定します
テスト: 満たさなければならない条件 (正規表現、引用符を追加しない、一致する)
exclude: 条件を満たしていない (処理対象外のディレクトリを除く)
include: インポートされたファイルがローダーによって変換されるパスまたはファイル配列 (処理対象のディレクトリを含む)
これ不必要なトラバーサルを削減できるため、パフォーマンスの損失が軽減されます。
コード圧縮ツールを置き換えます
Webpack によってデフォルトで提供される UglifyJS プラグインは、シングルスレッド圧縮のため低速です
webpack-Parallel-uglify-plugin プラグインは、UglifyJS プラグインを実行できます。並行して、CPU リソースをより完全かつ合理的に使用することで、ビルド時間を大幅に短縮できます
もちろん、このプラグインは開発環境ではなく運用環境で使用する必要があります。次の設定:
// 删掉webpack提供的UglifyJS插件 // new webpack.optimize.UglifyJsPlugin({ // compress: { // warnings: false, // drop_console: true // }, // sourceMap: true // }), // 增加 webpack-parallel-uglify-plugin来替换 const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin'); new ParallelUglifyPlugin({ cacheDir: '.cache/', // 设置缓存路径,不改动的调用缓存,第二次及后面build时提速 uglifyJS:{ output: { comments: false }, compress: { warnings: false } } })
同じタイプのプラグイン webpack-uglify-Parallel も試しましたが、機能しませんでした。 webpack-Parallel-uglify-plugin ほど効果的ではありません (プロジェクトによって異なる場合があります。プロジェクト内での比較に使用できます)。
webpack-Parallel-uglify-plugin プラグインは、UglifyJsPlugin によって生成されたパッケージよりもわずかに大きいですが (ただし、明らかではありません)、サイズの増加と比較して、速度を追求することにしました (使用後は 40 秒から 40 秒に短縮されました)。 19秒)。
静的ファイルをコピーします
copy-webpack-plugin プラグインを使用します: 指定されたフォルダー内のファイルを指定されたディレクトリにコピーします。その構成は次のとおりです:
var CopyWebpackPlugin = require('copy-webpack-plugin') plugins: [ ... // copy custom static assets new CopyWebpackPlugin([ { from: path.resolve(__dirname, '../static'), to: config.build.assetsSubDirectory, ignore: ['.*'] } ]) ] DllPlugin & DllReferencePlugin
Dll の概念は、 Windows システムの dll。 dll パッケージは純粋に依存するライブラリであり、それ自体では実行できず、アプリ内で参照するために使用されます。
DLL をパッケージ化するとき、Webpack は含まれるすべてのライブラリのインデックスを作成し、DLL (DLL ユーザー) を参照するコードをパッケージ化するときに、このマニフェスト ファイルを読み取るだけで済みます。
1. 次の内容を含むファイル webpack.dll.conf.js をプロジェクト ビルド フォルダーに追加します
var path = require('path') var webpack = require('webpack') module.exports = { entry: { vendor: [ // 这里填写需要的依赖库 'babel-polyfill', 'axios', 'vue/dist/vue.common.js', 'vue-router', 'pingpp-js', "region-picker" ] }, output: { path: path.resolve(__dirname, '../static/js'), filename: '[name].dll.js', library: '[name]_library' }, module: { rules: [ { test: /\.vue$/, loader: 'vue-loader' }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ } ] }, plugins: [ new webpack.optimize.ModuleConcatenationPlugin(), new webpack.DllPlugin({ path: path.join(__dirname, '.', '[name]-manifest.json'), libraryTarget: 'commonjs2', name: '[name]_library' }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }) ] }
2. プラグイン部分を webpack.prod.conf.js ファイルに追加します。
plugins: [ ... // copy custom static assets new webpack.DllReferencePlugin({ context: path.resolve(__dirname, '..'), manifest: require('./vendor-manifest.json') }) ]
<body>
<p id="app"></p>
<!-- built files will be auto injected -->
<script src="<%= webpackConfig.output.publicPath %>spa/js/vendor.dll.js"></script> //添加这句,路径可根据所需修改
</body>
"build:dll": "webpack --config build/webpack.dll.conf.js"
npm run build:dll //打包一次之后依赖库无变动不需要执行
npm run build
Dllは、パッケージ化された後も独立して存在し、含まれるライブラリが増加、減少、またはアップグレードされない限り、ハッシュは変更されないため、オンラインDLLコードを変更する必要はありません。バージョンリリースとともに頻繁に更新されます。 アプリ パーツのコードを変更した後は、含まれるライブラリが増加、減少、またはアップグレードされない限り、アプリ パーツのコードと DLL パーツをコンパイルするだけで済み、再パッケージする必要はありません。これにより、各コンパイルの速度も大幅に向上します。
同じ依存ライブラリを使用する複数のプロジェクトがあると仮定すると、それらは 1 つの DLL を共有できます。
19s->15s
babelのcacheDirectoryをtrueに設定しますwebpack.base.conf.jsのbabel-loaderを変更します: もしあなたならモジュールに他の新しい依存関係がないことを確認するには、これを設定できます。これにより、Webpack はこのファイルの依存関係をスキャンしなくなります。これにより、より大きなクラス ライブラリのパフォーマンスが向上します。詳細については、次の設定を参照してください。以上、皆様に向けてまとめさせていただきましたので、今後皆様のお役に立てれば幸いです。 関連記事: 以上がvue-cli で webpack2 プロジェクトのパッケージ化最適化を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。loader: 'babel-loader?cacheDirectory=true',