予備の注釈: 1)npmでプロジェクトにインストールできるdllファイルを作成したい、2)HTMLに別のスクリプトタグを何らかの形で含めること。このスクリプトは実行時に、アプリケーションスクリプトが依存関係を解決するために使用する関数を公開するグローバル変数を作成します。 また、すでにpackage.json
しかインストールされておらず、webpackの準備が整っているdllバンドル用のディレクトリがあるとします。
まず、あなたがこのようなwebpack.config.js
作成:
dll-project
|_ node_modules
| |_ preact
|_ main.js
|_ main-mainifest.json
|_ package.json
|_ webpack.config.js
: var webpack = require("webpack");
var path = require("path");
module.exports= {
entry: ["preact"], // put here every module that goes into the dll
output: {
path: __dirname,
filename: "index.js",
library: "[name]_[hash]"
},
plugins: [
new webpack.DllPlugin({
path: path.join(__dirname, "[name]-manifest.json"),
name: "[name]_[hash]" // (keep consistent with output.library)
})
]
};
今すぐDLLプロジェクトフォルダの構造は今
$ webpack
とのバンドルとそのマニフェストを作成します
このパッケージを別のプロジェクト、アプリにインストールしました:
app
|_ node_modules
| |_ dll-project
|_ index.js
|_ package.json
|_ webpack.config.js
このwebpack.config.js
は次のように(またはそれに類似した)に見えるこの:あなたのindex.js
で
var webpack = require("webpack");
module.exports= {
entry: "./index.js",
output: {
path: __dirname,
filename: "app.js"
},
plugins: [
new webpack.DllReferencePlugin({
scope: mydll,
manifest: require("./node_modules/dll-project/main-manifest.json")
})
]
};
、アプリのコードである、あなたは、このようにDLLバンドルしているモジュールが必要です。
var React = require("mydll/node_modules/preact/dist/preact");
あなたがwebpack -d
を実行する場合は、012を生成して、次のようなものが表示されます:
/* 1 */
/*!***************************************************************************************************!*\
!*** delegated ./node_modules/preact/dist/preact.js from dll-reference main_2057857de340fdcfd8aa ***!
\***************************************************************************************************/
一つは、「なぜ、私はちょうど私の標準はrequire("preact")
のような必要と使用することはできません?」尋ねるかもしれません。答えはあなたができることですが、。しかし、その場合は、あなたのアプリケーション内にのdllバンドルにあるこれらの依存関係をすべてインストールする必要があります。この場合、「スコープモード」(Webpack Docsを参照)の代わりに「マップモード」を使用するためです。
スコープモードでは、明示的にrequire
マニフェストを基準にしたモジュールへのパスが必要です。これは、アプリ内にモジュールをインストールする必要はありません(また、package.json
に依存している必要があります)。
マップモードでは、通常のように(アプリケーションのnode_modulesにインストールされているように)モジュールを要求できますが、アプリを使用してdllにもインストールする必要があります。これは、Webpackが最初にrequire
呼び出しを評価してから、同じモジュールがdllバンドルにも含まれていることに気づき、エイリアス( "委任された...")だけを出力にレンダリングするためです。
私はこれらの両方のモードのユースケースがあると思います。マップされたモードは、あなたのビルドをスピードアップするためのアプリケーションローカルDLLを構築しているだけの場合はクールです。その場合、あなたはインストールし、とにかくローカルにdllに入るすべてのdepsを保存します。しかし、インストール可能なモジュールとしてdllバンドルを構築してアプリ間で共有したい場合、そしてこれらのアプリごとにdllのすべてのモジュールを追跡したくない場合は、スコープを使用することをお勧めしますより冗長なrequire
コールの価格を支払うモード。
ありがとうございます、私はあなたのソリューションをチェックアウトし、あなたに連絡します。 興味深いことに、[Bilbasen](http://www.bilbasen.dk/)(携帯電話に最適化されたバージョン)の人々は、私が計画していることを正確に実行しており、それは彼らのために働いています。 –
優れた回答、ありがとうございます! –
これは3日間の混乱を解消しました。ありがとうございました。私はDllReferencePluginを変更して、manifest.jsonファイルにあるものを盲目的に受け入れることを願っています。私はマニフェストに存在するときに必要を解決するためにwebpackの必要性を見ません。 –