webpack複数ページ応用アーキテクチャシリーズ(七):開発環境、生産環境が馬鹿で分かりませんか?
8279 ワード
この文章は最初に
Aray_Huangの技術ブログ――
原文の住所:
開発環境と生産環境の分離の原因は以下の通りです.開発時、大量のdebugまたはテストコードが発生することは避けられません.これらのコードは生産環境に現れるべきではありません. ページをサーバーに配置する時、極致の技術指標を追求するために、コードに対して様々な最適化を行います.例えば、混淆、圧縮などの手段はコード自体の可読性を徹底的に破壊し、debugなどの仕事に不利です. データソースの差異化、例えば、ローカル開発時にはローカルmockからのデータを読み取ることが多いが、正式オンラインになってから読むのは当然APIからのデータである. 無理に開発環境と生産環境で同じコードを使うと、必ず重い代価を払います.
開発環境と生産環境をどのように分離するかを紹介します.一つはどのように異なる方法でコンパイルしますか?つまり、開発環境と生産環境のwebpack配置ファイルをそれぞれ形成します.第二に、ビジネスコードの中で、環境によってどのように違った処理が行われますか?
開発環境と生産環境のwebpack配置ファイルをどのように分離しますか?
同時に一つの完全な開発環境プロファイルと一つの完全な生産環境プロファイルを並べて比較すれば、次の三つの状況が現れます.開発環境によっては、必ずしも生産環境があるとは限りません.例えば開発時にsourcemapを生成してdebugを助けたり、熱更新時に使用される 生産環境によっては、開発環境が必ずしもあるとは限らない.例えば、jsを混同するための 開発環境と生産環境はすべて持っている構成ですが、詳細には 更に重要なのは、実際に開発環境と生産環境の配置文書のほとんどが一致しています.この一致した部分に対して、私達は断固として冗長性を除去します.そうでないと、その後の維持は面倒なだけでなく、間違いやすいです.
どうしますか
答えは簡単です.webpackの設定ファイルをNつの小さいmoduleに分割します.もとは私達は1つの完備している配置のファイルで、何百行もあって、初めから最後まですべて頭が大きくなったことを見て、更に分離しないことを言う必要はありません.分離の結果を見てみます.
開発/生産環境の配置ファイルはどうやって呼び出しますか?
「web pack複数ページアプリケーションアーキテクチャシリーズ(二):web pack構成の常用部分はどれですか?」で述べましたが、コンソールでwebpackコマンドを呼び出してパッケージを起動する時に、
業務コードはどうやって生産/開発環境を判断しますか?
ビジネスコードで生産/開発環境を判断するのは簡単です.変数一つでいいです.
私はまだ開発と生産環境を分離していません.開発時に業務コードで使用される配置ファイルの中でこの変数を
どうしますか
多くの文章を参考にしましたが、まず私が採用していない方法を大雑把に説明します.は、 は、異なる環境において異なるプロファイル(トラヒックコード用)をロードするように 私が使っているのはどんな方法ですか?最後に選んだのは
公式例を挙げると、その大体の使い方はこうです.
もう一つの例を挙げてください.たとえばコードにはこう書いてあります.
サンプルコード
皆さんはこのシリーズの文章を見て、私のGithub上の足場プロジェクトに合わせて食べたほうがいいですよ(笑):アラ-Huing/webpack-seed(
シリーズの記事カタログを添付します(同期更新) webpack複数ページアプリケーションアーキテクチャシリーズ(一):一歩ずつアーキテクチャの痛みを解決する: webpack複数ページアプリケーションアーキテクチャシリーズ(二):webpack構成の常用部分は何ですか? webpack複数ページアプリケーションアーキテクチャシリーズ(三):共通コードをどうやって梱包すれば重複を回避できますか? webpack複数ページアプリケーションアーキテクチャシリーズ(四):旧式jQueryプラグインはまだなくしてはいけませんが、どう対応していますか? webpack複数ページアプリケーションアーキテクチャシリーズ(五):webpackはless/cssまで包装できると聞きました. webpack複数ページアプリケーションアーキテクチャシリーズ(六):webpackは写真とフォントも包装できると聞きました. webpack多ページ応用アーキテクチャシリーズ(七):開発環境、生産環境が馬鹿で分かりません. webpackマルチページアプリケーションアーキテクチャシリーズ(8):コーチはES 6を書きます.webpackはどうやってBabelを統合しますか? webpack多ページ応用アーキテクチャシリーズ(9):いつも意地悪な人が余を害したいです.ESLintはごみコードをブロックします. webpack複数ページアプリケーションアーキテクチャシリーズ(10):どのようにカスタマイズされたbootstrapを作成しますか? webpack複数ページアプリケーションアーキテクチャシリーズ(11):プリパックDll、webpack音速コンパイルを実現する: webpack複数ページアプリケーションアーキテクチャシリーズ(12):webpackを利用してHTML普通ページ&ページテンプレートを生成する: webpack複数ページアプリケーションアーキテクチャシリーズ(13):簡単なテンプレートレイアウトシステムを構築する: webpack複数ページアプリケーションアーキテクチャシリーズ(14):Noコピー貼り付け!多項目共用インフラ webpack複数ページアプリケーションアーキテクチャシリーズ(15):フロントエンドがバックエンドレンダリング開発モードにおいて、サンドイッチ生存 webpack複数ページアプリケーションアーキテクチャシリーズ(十六):ブラウザキャッシュを善用し、行くならば、 を残します.
この文章は最初に
Aray_Huangの技術ブログ――
原文の住所:
Aray_Huangの技術ブログ――
、著作者の同意なしに転載しないでください.原文の住所:
https://segmentfault.com/a/1190000006952432
このシリーズの文章に興味があるなら、ここに注目してください.https://segmentfault.com/blog/array_huang
前言開発環境と生産環境の分離の原因は以下の通りです.
開発環境と生産環境をどのように分離するかを紹介します.一つはどのように異なる方法でコンパイルしますか?つまり、開発環境と生産環境のwebpack配置ファイルをそれぞれ形成します.第二に、ビジネスコードの中で、環境によってどのように違った処理が行われますか?
開発環境と生産環境のwebpack配置ファイルをどのように分離しますか?
同時に一つの完全な開発環境プロファイルと一つの完全な生産環境プロファイルを並べて比較すれば、次の三つの状況が現れます.
HotModuleReplacementPlugin
.UglifyJsPlugin
.output.publicPath
、例えばcss-loader
のminimize
とautoprefixer
のパラメータがあります.どうしますか
答えは簡単です.webpackの設定ファイルをNつの小さいmoduleに分割します.もとは私達は1つの完備している配置のファイルで、何百行もあって、初めから最後まですべて頭が大きくなったことを見て、更に分離しないことを言う必要はありません.分離の結果を見てみます.
├─webpack.dev.config.js # webpack ( , )
├─webpack.config.js # webpack ( , )
├─webpack-config # webpack
├─entry.config.js # webpack ,
├─module.config.js
├─output.config.js
├─plugins.dev.config.js # , webpack.dev.config.js
├─plugins.product.config.js # , webpack.config.js
├─resolve.config.js
│
├─base #
│ ├─dir-vars.config.js
│ ├─page-entries.config.js
│
├─inherit # ,
│ ├─plugins.config.js
│
└─vendor # webpack
├─eslint.config.js
├─postcss.config.js
ファイルディレクトリの構造を見ました.最後の配置ファイルを整理するにはどうすればいいですか?/* webpack webpack.dev.config.js */
module.exports = {
entry: require('./webpack-config/entry.config.js'),
output: require('./webpack-config/output.config.js'),
module: require('./webpack-config/module.config.js'),
resolve: require('./webpack-config/resolve.config.js'),
plugins: require('./webpack-config/plugins.dev.config.js'),
eslint: require('./webpack-config/vendor/eslint.config.js'),
postcss: require('./webpack-config/vendor/postcss.config.js'),
};
これで、開発/生産環境設定ファイルの同じ部分と異なる部分を簡単に処理できます.開発/生産環境の配置ファイルはどうやって呼び出しますか?
「web pack複数ページアプリケーションアーキテクチャシリーズ(二):web pack構成の常用部分はどれですか?」で述べましたが、コンソールでwebpackコマンドを呼び出してパッケージを起動する時に、
--config
パラメータを追加してwebpack設定ファイルのパスを指定してもいいですか?私たちはnpm scripts
に合わせて使用できます.package.jsonで定義します. "scripts": {
"build": "node build-script.js && webpack --progress --colors",
"dev": "node build-script.js && webpack --progress --colors --config ./webpack.dev.config.js",
"watch": "webpack --progress --colors --watch --config ./webpack.dev.config.js"
},
こうすれば、私たちが開発したときにはnpm run dev
またはnpm run watch
を使用して、オンラインで荷造りするときにはnpm run build
を実行することができます.業務コードはどうやって生産/開発環境を判断しますか?
ビジネスコードで生産/開発環境を判断するのは簡単です.変数一つでいいです.
if (IS_PRODUCTION) {
//
} else {
//
}
これは、この変数IS_PRODUCTION
がどうやって来たかが鍵となる.私はまだ開発と生産環境を分離していません.開発時に業務コードで使用される配置ファイルの中でこの変数を
false
に設定して、最後にオンラインを包装する時に手動でtrue
に変更する方法を使っています.このような方法は一時期使ったことがあります.とても煩わしいです.そしてよくオンラインしてみたら、私はどうやってajaxに行ったらいいですか?どうしますか
多くの文章を参考にしましたが、まず私が採用していない方法を大雑把に説明します.
EnvironmentPlugin
を用いてprocess.envを導入することによって、業務コードの中でprocess.env.NODE_ENV
によって判断することができる.ProvidePlugin
で制御する.DefinePlugin
です.公式例を挙げると、その大体の使い方はこうです.
new webpack.DefinePlugin({
PRODUCTION: JSON.stringify(true),
VERSION: JSON.stringify("5fa3b9"),
BROWSER_SUPPORTS_HTML5: true,
TWO: "1+1",
"typeof window": JSON.stringify("object")
})
DefinePlugin
は、その役割はwebpackプロファイルにおいてコンパイルされたコードコンテキスト環境のために大域変数が設定されていると誤解されるかもしれないが、そうではない.その真のメカニズムは、DefinePlugin
のパラメータがobjectである場合、いくつかのkey-value
ペアがあります.webpackコンパイルの場合、トラフィックコードには定義がなく、変数名はkey
と同じ変数(直接コードを読むとグローバル変数のようです)に置き換えられます.例えば上記の公式例では、value
はPRODUCTION
に置き換えられる.true
はVERSION
に置き換えられます.'5fa3b9'
もBROWSER_SUPPORTS_HTML5
に置き換えられる.true
は、TWO
に置き換えられる(したがって、数学的表現に相当する).1+1
はtypeof window
に置き換えられた.もう一つの例を挙げてください.たとえばコードにはこう書いてあります.
if (!PRODUCTION)
console.log('Debug info')
if (PRODUCTION)
console.log('Production log')
コンパイルで生成されたコードの中ではこうなります.if (!true)
console.log('Debug info')
if (true)
console.log('Production log')
'object'
を使ったら、こうなります.console.log('Production log')
このようにすれば、2つの環境のプロファイルにUglifyJsPlugin
でDefinePlugin
の値をそれぞれ定義しておけば、ビジネスコードで判断できる. /* global IS_PRODUCTION:true */
if (!IS_PRODUCTION) {
console.log(' Log, ');
}
注意したいのは、webpackにESLINEが統合されている場合、ESLintは、定義されていない変数(ESLINEがグローバル変数の使用を要求する場合はIS_PRODUCTION
と書く)を検出するので、window.xxxxx
の注釈文(global
)IS_が必要です.PRODUCTIONはグローバル変数です.サンプルコード
皆さんはこのシリーズの文章を見て、私のGithub上の足場プロジェクトに合わせて食べたほうがいいですよ(笑):アラ-Huing/webpack-seed(
/* global IS_PRODUCTION:true */
).シリーズの記事カタログを添付します(同期更新)
https://github.com/Array-Huang/webpack-seed
https://segmentfault.com/a/1190000006843916
https://segmentfault.com/a/1190000006863968
https://segmentfault.com/a/1190000006871991
https://segmentfault.com/a/1190000006887523
https://segmentfault.com/a/1190000006897458
https://segmentfault.com/a/1190000006907701
https://segmentfault.com/a/1190000006952432
https://segmentfault.com/a/1190000006992218
https://segmentfault.com/a/1190000007030775
https://segmentfault.com/a/1190000007043716
https://segmentfault.com/a/1190000007104372
https://segmentfault.com/a/1190000007126268
この文章は最初に
Aray_Huangの技術ブログ――
https://segmentfault.com/a/1190000007159115
、著作者の同意なしに転載しないでください.原文の住所:
このシリーズの文章に興味があるなら、ここに注目してください.https://segmentfault.com/a/1190000006952432