ReactとWebpackの構築とパッケージ化の最適化例の詳細な説明

小云云
リリース: 2018-01-24 09:57:19
オリジナル
1628 人が閲覧しました

この記事は主に React + Webpack の構築とパッケージ化の最適化について簡単に説明したもので、編集者が非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

babel-react-optimize を使用して React コードを最適化します

未使用のライブラリをチェックし、インポート参照を削除します

lodash、echart など、使用されているライブラリをオンデマンドでパッケージ化します

lodash は babel-plugin -lodash を使用できます最適化のために。

は、babel-react-optimizeのbabel-plugin-transform-react-remove-prop-typesプラグインを使用することに注意してください。通常、コード内でコンポーネントの PropType を参照しなくても、まったく問題ありません。このプラグインをコンポーネントで使用すると、問題が発生する可能性があります。

詳細については、次を参照してください:

https://github.com/oliviertassinari/babel-plugin-transform-react-remove-prop-types#is-it-safe

Webpack のビルドとパッケージの最適化

Webpackビルドとパッケージの存在 問題は主に次の 2 つの側面に焦点を当てています:

  1. Webpack のビルドが遅い

  2. Webpack のパッケージ化されたファイルのサイズが大きすぎる

Webpack のビルドが遅い

Webpack.DDLPlugin および HappyPack ビルド速度を向上させます。詳細については、DMP DDLPlugin に関する Xiaoming のドキュメントを参照してください。元のテキストは次のとおりです:

Webpack.DLLPlugin

webpack.dll.config.js の追加
は主に DllPlugin プラグインを使用して、いくつかのサードパーティ リソースを個別にパッケージ化し、それらを manages.json 構成ファイルに配置します。

このように、コンポーネントでの更新後、これらのサードパーティ リソースは再構築されません

  1. 同時に、dll/vendors.js ファイルは独立して構成され、webpack.dll.config に提供されます。 .js

  2. package.json

    を変更します

スクリプトに「dll」:「webpack --config webpack.dll.config.js --progress --colors」を追加します。

npm run dllを実行すると、dllディレクトリにvendor-manifest.jsonとvendor.dll.jsの2つのファイルが生成されます

webpack.dev.config.jsファイルを設定し、DllReferencePluginプラグインを追加して指定しますベンダーマニフェスト .json ファイル


new webpack.DllReferencePlugin({
 context: join(__dirname, 'src'),
 manifest: require('./dll/vendor-manifest.json')
})
ログイン後にコピー

html を変更します


<% if(htmlWebpackPlugin.options.NODE_ENV ==='development'){ %>
 
<% } %>
ログイン後にコピー

htmlWebpackPlugin プラグインで NODE_ENV パラメータを設定する必要があることに注意してください

Happypack

マルチを通じてスレッド、キャッシュなど。 https://github.com/amireh/happypack

webpack.dev.config.js で異なるリソースに対して複数の HappyPack (1 js、1less など) を作成し、id を設定します


new HappyPack({
 id: 'js',
 threadPool: happyThreadPool,
 cache: true,
 verbose: true,
 loaders: ['babel-loader?babelrc&cacheDirectory=true'],
}),
new HappyPack({
 id: 'less',
 threadPool: happyThreadPool,
 cache: true,
 verbose: true,
 loaders: ['css-loader', 'less-loader'],
})
ログイン後にコピー

モジュールで、ルールでの使用を happypack/loader に設定し、id を設定します


{
 test: /\.js$/,
 use: [
 'happypack/loader?id=js'
 ],
 exclude: /node_modules/
}, {
 test: /\.less$/,
 loader: extractLess.extract({
 use: ['happypack/loader?id=less'],
 fallback: 'style-loader'
 })
}
ログイン後にコピー

Webpack パッケージ化後のファイル サイズを削減します

まず、バンドル全体、構成内容を分析する必要があります。各コンポーネントのサイズとサイズ。

ここでは Webpack-bundle-analyzer をお勧めします。インストール後、プラグインを webpack.dev.config.js に追加するだけで、以下に示すように、起動するたびに分析結果が Web サイト上で自動的に開かれます


plugins.push( new BundleAnalyzerPlugin());
ログイン後にコピー

プロセスも json ファイルに出力されます


webpack --profile --json -> stats.json
ログイン後にコピー

その後、分析のために次の 2 つの Web サイトにアクセスしてください

  1. webpack/analyse

  2. Webpack Chart

上記のチャートを見るとよくわかりますバンドル全体の .js コンポーネントと対応するサイズを分析します。

bundle.js サイズが過剰になる問題の解決策は次のとおりです:

  1. 本番環境で圧縮とその他のプラグインを有効にし、不要なプラグインを削除します

  2. ビジネスコードとサードパーティを分割しますライブラリとパブリック モジュール

  3. webpack gzip 圧縮を有効にする

  4. オンデマンドでロードする

実稼働環境で圧縮とその他のプラグインを有効にし、不要なプラグインを削除する

必ず webpack.DefinePlugin を起動し、運用環境の webpack.optimize.UglifyJsPlugin。


const plugins = [
 new webpack.DefinePlugin({
  'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production')
 }),
  new webpack.optimize.UglifyJsPlugin({
  compress: {
   warnings: false,
   drop_console: false //eslint-disable-line
  }
  })   
]
ログイン後にコピー

ビジネス コードをサードパーティ ライブラリとパブリック モジュールで分割する

プロジェクトのビジネス コードは非常に頻繁に変更されるため、サードパーティ ライブラリのコードの変更頻度は比較的低くなります。ビジネス コードとサードパーティ ライブラリが同じチャンクにパッケージ化されている場合、ビジネス コードが 1 行だけ変更された場合でも、サードパーティ ライブラリのコードが変更されなかった場合でも、ビルドごとに、全体のハッシュはチャンクは前回とは異なります。これは私たちが望む結果ではありません。私たちが望んでいるのは、サードパーティ ライブラリのコードが変更されない場合、構築時に対応するハッシュが変更されないことを確認し、ブラウザ キャッシュを使用してページ読み込みのパフォーマンスを向上させ、ページ読み込みを短縮できるようにすることです。時間。

因此可以将第三库的代码单独拆分成 vendor chunk,与业务代码分离。这样就算业务代码再怎么发生变化,只要第三方库代码没有发生变化,对应的 hash 就不变。

首先 entry 配置两个 app 和 vendor 两个chunk


entry: {
 vendor: [path.join(__dirname, 'dll', 'vendors.js')],
 app: [path.join(__dirname, 'src/index')]
},
output: {
 path: path.resolve(__dirname, 'build'),
 filename: '[name].[chunkhash:8].js'
},
ログイン後にコピー

其中 vendros.js 是自己定义的哪些第三方库需要纳入 vendor 中,如下:


require('babel-polyfill');
require('classnames');
require('intl');
require('isomorphic-fetch');
require('react');
require('react-dom');
require('immutable');
require('redux');
ログイン後にコピー

然后通过 CommonsChunkPlugin 拆分第三库


plugins.push(
 // 拆分第三方库
 new webpack.optimize.CommonsChunkPlugin({ name: 'vendor' }),
 // 拆分 webpack 自身代码
 new webpack.optimize.CommonsChunkPlugin({
  name: 'runtime',
  minChunks: Infinity
 })
);
ログイン後にコピー

上面的配置有两个细节需要注意

  1. 使用 chunkhash 而不用 hash

  2. 单独拆分 webpack 自身代码

使用 chunkhash 而不用 hash

先来看看这二者有何区别:

  1. hash 是 build-specific ,任何一个文件的改动都会导致编译的结果不同,适用于开发阶段

  2. chunkhash 是 chunk-specific ,是根据每个 chunk 的内容计算出的 hash,适用于生产

因此为了保证第三方库不变的情况下,对应的 vendor.js 的 hash 也要保持不变,我们再 output.filename 中采用了 chunkhash

单独拆分 webpack 自身代码

Webpack 有个已知问题:

webpack 自身的 boilerplate 和 manifest 代码可能在每次编译时都会变化。

这导致我们只是在 入口文件 改了一行代码,但编译出的 vendor 和 entry chunk 都变了,因为它们自身都包含这部分代码。

这是不合理的,因为实际上我们的第三方库的代码没变,vendor 不应该在我们业务代码变化时发生变化。

因此我们需要将 webpack 这部分代码分离抽离


new webpack.optimize.CommonsChunkPlugin({
   name: "runtime",
   minChunks: Infinity
}),
ログイン後にコピー

其中的 name 只要不在 entry 即可,通常使用 "runtime" 或 "manifest" 。

另外一个参数 minChunks 表示:在传入公共chunk(commons chunk) 之前所需要包含的最少数量的 chunks。数量必须大于等于2,或者少于等于 chunks的数量,传入 Infinity 会马上生成 公共chunk,但里面没有模块。

拆分公共资源

同 上面的拆分第三方库一样,拆分公共资源可以将公用的模块单独打出一个 chunk,你可以设置 minChunk 来选择是共用多少次模块才将它们抽离。配置如下:


new webpack.optimize.CommonsChunkPlugin({
 name: 'common',
 minChunks: 2,
}),
ログイン後にコピー

是否需要进行这一步优化可以自行根据项目的业务复用度来判断。

开启 gzip

使用 CompressionPlugin 插件开启 gzip 即可:


// 添加 gzip
new CompressionPlugin({
 asset: '[path].gz[query]',
 algorithm: 'gzip',
 test: /\.(js|html)$/,
 threshold: 10240,
 minRatio: 0.8
})
ログイン後にコピー

大家学会了吗?赶紧动手尝试一下吧。

相关推荐:

parcel.js打包出错到选择nvm的全部过程解析

Parcel打包示例详解

webpack多入口文件页面打包详解


以上がReactとWebpackの構築とパッケージ化の最適化例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!