2017-02-24 17 views
0

ユースケース/要件/問題:彼らは、複数のangular2のアプリで再利用することができるように
ホストベンダーとpolyfillsがCDNで別々にバンドル。ベンダーとポリフィルバンドルは、webpack 2を使用して別々のangle2アプリとして構築され、結果として得られるバンドルはCDNでホストされ、N個のangular2アプリによって再利用されます。建物とホスティングベンダーバンドル別途

私は何ですか?
angular2 webpack2 starterのスタータープロジェクトを使用してwebpackで良いサイズのang2プロジェクトを作成しました。プロードモードでビルドして、うまく動作します。 私たちは社内のCDNを持っているので、ベンダーとポリフィルドを別々にホストすることに決めました。これは、ホストされているときに他のangular2プロジェクトでも再利用できます。
ベンダーとポリフィルを具体的に構築するang2プロジェクトを作成しました

私は何をコードしましたか?
基本的には、私はウェブパックの設定のどこかで迷惑をかけると信じています。 これは、良いサイズのangular2プロジェクトから私のwebpack.common.js

以下
/** 
* @author: @AngularClass 
*/ 

const webpack = require('webpack'); 
const helpers = require('./helpers'); 

/* 
* Webpack Plugins 
*/ 
// problem with copy-webpack-plugin 
const AssetsPlugin = require('assets-webpack-plugin'); 
const NormalModuleReplacementPlugin = require('webpack/lib/NormalModuleReplacementPlugin'); 
const ContextReplacementPlugin = require('webpack/lib/ContextReplacementPlugin'); 
const CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin'); 
const CopyWebpackPlugin = require('copy-webpack-plugin'); 
const CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin; 
const HtmlElementsPlugin = require('./html-elements-plugin'); 
const HtmlWebpackPlugin = require('html-webpack-plugin'); 
const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); 
const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin'); 
const ngcWebpack = require('ngc-webpack'); 

/* 
* Webpack Constants 
*/ 
const HMR = helpers.hasProcessFlag('hot'); 
const AOT = helpers.hasNpmFlag('aot'); 
const METADATA = { 
    title: 'Angular2 Webpack Starter by @gdi2290 from @AngularClass', 
    baseUrl: '/', 
    isDevServer: helpers.isWebpackDevServer() 
}; 

/* 
* Webpack configuration 
* 
* See: http://webpack.github.io/docs/configuration.html#cli 
*/ 
module.exports = function (options) { 
    isProd = options.env === 'production'; 
    return { 

    recordsInputPath: 'webpack-module-records.json', 
    /* 
    * Cache generated modules and chunks to improve performance for multiple incremental builds. 
    * This is enabled by default in watch mode. 
    * You can pass false to disable it. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#cache 
    */ 
    //cache: false, 

    /* 
    * The entry point for the bundle 
    * Our Angular.js app 
    * 
    * See: http://webpack.github.io/docs/configuration.html#entry 
    */ 
    entry: { 

     'polyfills': './src/polyfills.browser.ts', 
     'vendor': './src/vendor.browser.ts', 
     'main': AOT ? './src/main.browser.aot.ts' : 
     './src/main.browser.ts' 

    }, 

    /* 
    * Options affecting the resolving of modules. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#resolve 
    */ 
    resolve: { 

     /* 
     * An array of extensions that should be used to resolve modules. 
     * 
     * See: http://webpack.github.io/docs/configuration.html#resolve-extensions 
     */ 
     extensions: ['.ts', '.js', '.json'], 

     // An array of directory names to be resolved to the current directory 
     modules: [helpers.root('src'), helpers.root('node_modules')], 

    }, 

    /* 
    * Options affecting the normal modules. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#module 
    */ 
    module: { 

     rules: [ 

     /* 
     * Typescript loader support for .ts and Angular 2 async routes via .async.ts 
     * Replace templateUrl and stylesUrl with require() 
     * 
     * See: https://github.com/s-panferov/awesome-typescript-loader 
     * See: https://github.com/TheLarkInn/angular2-template-loader 
     */ 
     { 
      test: /\.ts$/, 
      use: [ 
      '@angularclass/hmr-loader?pretty=' + !isProd + '&prod=' + isProd, 
      'awesome-typescript-loader?{configFileName: "tsconfig.webpack.json"}', 
      'angular2-template-loader', 
      { 
       loader: 'ng-router-loader', 
       options: { 
       loader: 'async-system', 
       genDir: 'compiled', 
       aot: AOT 
       } 
      } 
      ], 
      exclude: [/\.(spec|e2e)\.ts$/] 
     }, 

     /* 
     * Json loader support for *.json files. 
     * 
     * See: https://github.com/webpack/json-loader 
     */ 
     { 
      test: /\.json$/, 
      use: 'json-loader' 
     }, 

     /* 
     * to string and css loader support for *.css files (from Angular components) 
     * Returns file content as string 
     * 
     */ 
     { 
      test: /\.css$/, 
      use: ['to-string-loader', 'css-loader'], 
      exclude: [helpers.root('src', 'styles')] 
     }, 

     /* 
     * to string and sass loader support for *.scss files (from Angular components) 
     * Returns compiled css content as string 
     * 
     */ 
     { 
      test: /\.scss$/, 
      use: ['to-string-loader', 'css-loader', 'sass-loader'], 
      exclude: [helpers.root('src', 'styles')] 
     }, 

     /* Raw loader support for *.html 
     * Returns file content as string 
     * 
     * See: https://github.com/webpack/raw-loader 
     */ 
     { 
      test: /\.html$/, 
      use: 'raw-loader', 
      exclude: [helpers.root('src/index.html')] 
     }, 

     /* File loader for supporting images, for example, in CSS files. 
     */ 
     { 
      test: /\.(jpg|png|gif)$/, 
      use: 'file-loader' 
     }, 

     ], 

    }, 

    /* 
    * Add additional plugins to the compiler. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#plugins 
    */ 
    plugins: [ 
     new AssetsPlugin({ 
     path: helpers.root('dist'), 
     filename: 'webpack-assets.json', 
     prettyPrint: true 
     }), 

     /* 
     * Plugin: ForkCheckerPlugin 
     * Description: Do type checking in a separate process, so webpack don't need to wait. 
     * 
     * See: https://github.com/s-panferov/awesome-typescript-loader#forkchecker-boolean-defaultfalse 
     */ 
     new CheckerPlugin(), 
     /* 
     * Plugin: CommonsChunkPlugin 
     * Description: Shares common code between the pages. 
     * It identifies common modules and put them into a commons chunk. 
     * 
     * See: https://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin 
     * See: https://github.com/webpack/docs/wiki/optimization#multi-page-app 
     */ 

     // This enables tree shaking of the vendor modules 
     new webpack.optimize.CommonsChunkPlugin({ 
     name: ['app', 'vendor', 'polyfills'], 
     minChunks: Infinity 
     }), 

     /** 
     * Plugin: ContextReplacementPlugin 
     * Description: Provides context to Angular's use of System.import 
     * 
     * See: https://webpack.github.io/docs/list-of-plugins.html#contextreplacementplugin 
     * See: https://github.com/angular/angular/issues/11580 
     */ 
     new ContextReplacementPlugin(
     // The (\\|\/) piece accounts for path separators in *nix and Windows 
     /angular(\\|\/)core(\\|\/)src(\\|\/)linker/, 
     helpers.root('src'), // location of your src 
     { 
      // your Angular Async Route paths relative to this root directory 
     } 
    ), 

     /* 
     * Plugin: CopyWebpackPlugin 
     * Description: Copy files and directories in webpack. 
     * 
     * Copies project static assets. 
     * 
     * See: https://www.npmjs.com/package/copy-webpack-plugin 
     */ 
     new CopyWebpackPlugin([ 
     { from: 'src/assets', to: 'assets' }, 
     { from: 'src/meta' } 
     ]), 


     /* 
     * Plugin: HtmlWebpackPlugin 
     * Description: Simplifies creation of HTML files to serve your webpack bundles. 
     * This is especially useful for webpack bundles that include a hash in the filename 
     * which changes every compilation. 
     * 
     * See: https://github.com/ampedandwired/html-webpack-plugin 
     */ 
     new HtmlWebpackPlugin({ 
     template: 'src/index.html', 
     title: METADATA.title, 
     chunksSortMode: 'dependency', 
     metadata: METADATA, 
     inject: 'head' 
     }), 

     /* 
     * Plugin: ScriptExtHtmlWebpackPlugin 
     * Description: Enhances html-webpack-plugin functionality 
     * with different deployment options for your scripts including: 
     * 
     * See: https://github.com/numical/script-ext-html-webpack-plugin 
     */ 
     new ScriptExtHtmlWebpackPlugin({ 
     defaultAttribute: 'defer' 
     }), 

     /* 
     * Plugin: HtmlElementsPlugin 
     * Description: Generate html tags based on javascript maps. 
     * 
     * If a publicPath is set in the webpack output configuration, it will be automatically added to 
     * href attributes, you can disable that by adding a "=href": false property. 
     * You can also enable it to other attribute by settings "=attName": true. 
     * 
     * The configuration supplied is map between a location (key) and an element definition object (value) 
     * The location (key) is then exported to the template under then htmlElements property in webpack configuration. 
     * 
     * Example: 
     * Adding this plugin configuration 
     * new HtmlElementsPlugin({ 
     * headTags: { ... } 
     * }) 
     * 
     * Means we can use it in the template like this: 
     * <%= webpackConfig.htmlElements.headTags %> 
     * 
     * Dependencies: HtmlWebpackPlugin 
     */ 
     new HtmlElementsPlugin({ 
     headTags: require('./head-config.common') 
     }), 

     /** 
     * Plugin LoaderOptionsPlugin (experimental) 
     * 
     * See: https://gist.github.com/sokra/27b24881210b56bbaff7 
     */ 
     new LoaderOptionsPlugin({}), 

     // Fix Angular 2 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)async/, 
     helpers.root('node_modules/@angular/core/src/facade/async.js') 
    ), 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)collection/, 
     helpers.root('node_modules/@angular/core/src/facade/collection.js') 
    ), 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)errors/, 
     helpers.root('node_modules/@angular/core/src/facade/errors.js') 
    ), 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)lang/, 
     helpers.root('node_modules/@angular/core/src/facade/lang.js') 
    ), 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)math/, 
     helpers.root('node_modules/@angular/core/src/facade/math.js') 
    ), 

     new ngcWebpack.NgcWebpackPlugin({ 
     disabled: !AOT, 
     tsConfig: helpers.root('tsconfig.webpack.json'), 
     resourceOverride: helpers.root('config/resource-override.js') 
     }) 

    ], 

    /* 
    * Include polyfills or mocks for various node stuff 
    * Description: Node configuration 
    * 
    * See: https://webpack.github.io/docs/configuration.html#node 
    */ 
    node: { 
     global: true, 
     crypto: 'empty', 
     process: true, 
     module: false, 
     clearImmediate: false, 
     setImmediate: false 
    } 

    }; 
} 

/** 
* @author: @AngularClass 
*/ 

const webpack = require('webpack'); 
const helpers = require('./helpers'); 

/* 
* Webpack Plugins 
*/ 
// problem with copy-webpack-plugin 
const AssetsPlugin = require('assets-webpack-plugin'); 
const NormalModuleReplacementPlugin = require('webpack/lib/NormalModuleReplacementPlugin'); 
const ContextReplacementPlugin = require('webpack/lib/ContextReplacementPlugin'); 
const CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin'); 
const CopyWebpackPlugin = require('copy-webpack-plugin'); 
const CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin; 
const HtmlElementsPlugin = require('./html-elements-plugin'); 
const HtmlWebpackPlugin = require('html-webpack-plugin'); 
const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); 
const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin'); 
const ngcWebpack = require('ngc-webpack'); 

/* 
* Webpack Constants 
*/ 
const HMR = helpers.hasProcessFlag('hot'); 
const AOT = helpers.hasNpmFlag('aot'); 
const METADATA = { 
    title: 'Angular2 Webpack Starter by @gdi2290 from @AngularClass', 
    baseUrl: '/', 
    isDevServer: helpers.isWebpackDevServer() 
}; 

/* 
* Webpack configuration 
* 
* See: http://webpack.github.io/docs/configuration.html#cli 
*/ 
module.exports = function (options) { 
    isProd = options.env === 'production'; 
    return { 

    recordsInputPath: 'webpack-module-records.json', 
    /* 
    * Cache generated modules and chunks to improve performance for multiple incremental builds. 
    * This is enabled by default in watch mode. 
    * You can pass false to disable it. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#cache 
    */ 
    //cache: false, 

    /* 
    * The entry point for the bundle 
    * Our Angular.js app 
    * 
    * See: http://webpack.github.io/docs/configuration.html#entry 
    */ 
    entry: { 

     'polyfills': './src/polyfills.browser.ts', 
     'vendor': './src/vendor.browser.ts', 
     'main': AOT ? './src/main.browser.aot.ts' : 
     './src/main.browser.ts' 

    }, 

    /* 
    * Options affecting the resolving of modules. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#resolve 
    */ 
    resolve: { 

     /* 
     * An array of extensions that should be used to resolve modules. 
     * 
     * See: http://webpack.github.io/docs/configuration.html#resolve-extensions 
     */ 
     extensions: ['.ts', '.js', '.json'], 

     // An array of directory names to be resolved to the current directory 
     modules: [helpers.root('src'), helpers.root('node_modules')], 

    }, 

    /* 
    * Options affecting the normal modules. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#module 
    */ 
    module: { 

     rules: [ 

     /* 
     * Typescript loader support for .ts and Angular 2 async routes via .async.ts 
     * Replace templateUrl and stylesUrl with require() 
     * 
     * See: https://github.com/s-panferov/awesome-typescript-loader 
     * See: https://github.com/TheLarkInn/angular2-template-loader 
     */ 
     { 
      test: /\.ts$/, 
      use: [ 
      '@angularclass/hmr-loader?pretty=' + !isProd + '&prod=' + isProd, 
      'awesome-typescript-loader?{configFileName: "tsconfig.webpack.json"}', 
      'angular2-template-loader', 
      { 
       loader: 'ng-router-loader', 
       options: { 
       loader: 'async-system', 
       genDir: 'compiled', 
       aot: AOT 
       } 
      } 
      ], 
      exclude: [/\.(spec|e2e)\.ts$/] 
     }, 

     /* 
     * Json loader support for *.json files. 
     * 
     * See: https://github.com/webpack/json-loader 
     */ 
     { 
      test: /\.json$/, 
      use: 'json-loader' 
     }, 

     /* 
     * to string and css loader support for *.css files (from Angular components) 
     * Returns file content as string 
     * 
     */ 
     { 
      test: /\.css$/, 
      use: ['to-string-loader', 'css-loader'], 
      exclude: [helpers.root('src', 'styles')] 
     }, 

     /* 
     * to string and sass loader support for *.scss files (from Angular components) 
     * Returns compiled css content as string 
     * 
     */ 
     { 
      test: /\.scss$/, 
      use: ['to-string-loader', 'css-loader', 'sass-loader'], 
      exclude: [helpers.root('src', 'styles')] 
     }, 

     /* Raw loader support for *.html 
     * Returns file content as string 
     * 
     * See: https://github.com/webpack/raw-loader 
     */ 
     { 
      test: /\.html$/, 
      use: 'raw-loader', 
      exclude: [helpers.root('src/index.html')] 
     }, 

     /* File loader for supporting images, for example, in CSS files. 
     */ 
     { 
      test: /\.(jpg|png|gif)$/, 
      use: 'file-loader' 
     }, 

     ], 

    }, 

    /* 
    * Add additional plugins to the compiler. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#plugins 
    */ 
    plugins: [ 
     new AssetsPlugin({ 
     path: helpers.root('dist'), 
     filename: 'webpack-assets.json', 
     prettyPrint: true 
     }), 

     /* 
     * Plugin: ForkCheckerPlugin 
     * Description: Do type checking in a separate process, so webpack don't need to wait. 
     * 
     * See: https://github.com/s-panferov/awesome-typescript-loader#forkchecker-boolean-defaultfalse 
     */ 
     new CheckerPlugin(), 
     /* 
     * Plugin: CommonsChunkPlugin 
     * Description: Shares common code between the pages. 
     * It identifies common modules and put them into a commons chunk. 
     * 
     * See: https://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin 
     * See: https://github.com/webpack/docs/wiki/optimization#multi-page-app 
     */ 

     // This enables tree shaking of the vendor modules 
     new webpack.optimize.CommonsChunkPlugin({ 
     name: ['app', 'vendor', 'polyfills'], 
     minChunks: Infinity 
     }), 

     /** 
     * Plugin: ContextReplacementPlugin 
     * Description: Provides context to Angular's use of System.import 
     * 
     * See: https://webpack.github.io/docs/list-of-plugins.html#contextreplacementplugin 
     * See: https://github.com/angular/angular/issues/11580 
     */ 
     new ContextReplacementPlugin(
     // The (\\|\/) piece accounts for path separators in *nix and Windows 
     /angular(\\|\/)core(\\|\/)src(\\|\/)linker/, 
     helpers.root('src'), // location of your src 
     { 
      // your Angular Async Route paths relative to this root directory 
     } 
    ), 

     /* 
     * Plugin: CopyWebpackPlugin 
     * Description: Copy files and directories in webpack. 
     * 
     * Copies project static assets. 
     * 
     * See: https://www.npmjs.com/package/copy-webpack-plugin 
     */ 
     new CopyWebpackPlugin([ 
     { from: 'src/assets', to: 'assets' }, 
     { from: 'src/meta' } 
     ]), 


     /* 
     * Plugin: HtmlWebpackPlugin 
     * Description: Simplifies creation of HTML files to serve your webpack bundles. 
     * This is especially useful for webpack bundles that include a hash in the filename 
     * which changes every compilation. 
     * 
     * See: https://github.com/ampedandwired/html-webpack-plugin 
     */ 
     new HtmlWebpackPlugin({ 
     template: 'src/index.html', 
     title: METADATA.title, 
     chunksSortMode: 'dependency', 
     metadata: METADATA, 
     inject: 'head' 
     }), 

     /* 
     * Plugin: ScriptExtHtmlWebpackPlugin 
     * Description: Enhances html-webpack-plugin functionality 
     * with different deployment options for your scripts including: 
     * 
     * See: https://github.com/numical/script-ext-html-webpack-plugin 
     */ 
     new ScriptExtHtmlWebpackPlugin({ 
     defaultAttribute: 'defer' 
     }), 

     /* 
     * Plugin: HtmlElementsPlugin 
     * Description: Generate html tags based on javascript maps. 
     * 
     * If a publicPath is set in the webpack output configuration, it will be automatically added to 
     * href attributes, you can disable that by adding a "=href": false property. 
     * You can also enable it to other attribute by settings "=attName": true. 
     * 
     * The configuration supplied is map between a location (key) and an element definition object (value) 
     * The location (key) is then exported to the template under then htmlElements property in webpack configuration. 
     * 
     * Example: 
     * Adding this plugin configuration 
     * new HtmlElementsPlugin({ 
     * headTags: { ... } 
     * }) 
     * 
     * Means we can use it in the template like this: 
     * <%= webpackConfig.htmlElements.headTags %> 
     * 
     * Dependencies: HtmlWebpackPlugin 
     */ 
     new HtmlElementsPlugin({ 
     headTags: require('./head-config.common') 
     }), 

     /** 
     * Plugin LoaderOptionsPlugin (experimental) 
     * 
     * See: https://gist.github.com/sokra/27b24881210b56bbaff7 
     */ 
     new LoaderOptionsPlugin({}), 

     // Fix Angular 2 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)async/, 
     helpers.root('node_modules/@angular/core/src/facade/async.js') 
    ), 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)collection/, 
     helpers.root('node_modules/@angular/core/src/facade/collection.js') 
    ), 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)errors/, 
     helpers.root('node_modules/@angular/core/src/facade/errors.js') 
    ), 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)lang/, 
     helpers.root('node_modules/@angular/core/src/facade/lang.js') 
    ), 
     new NormalModuleReplacementPlugin(
     /facade(\\|\/)math/, 
     helpers.root('node_modules/@angular/core/src/facade/math.js') 
    ), 

     new ngcWebpack.NgcWebpackPlugin({ 
     disabled: !AOT, 
     tsConfig: helpers.root('tsconfig.webpack.json'), 
     resourceOverride: helpers.root('config/resource-override.js') 
     }) 

    ], 

    /* 
    * Include polyfills or mocks for various node stuff 
    * Description: Node configuration 
    * 
    * See: https://webpack.github.io/docs/configuration.html#node 
    */ 
    node: { 
     global: true, 
     crypto: 'empty', 
     process: true, 
     module: false, 
     clearImmediate: false, 
     setImmediate: false 
    } 

    }; 
} 

TLベンダーとpolyfills構築しAng2のプロジェクトから私の一般的な設定であり、DR - ポイントは上記で観察するには、 configsはrecordsPath、entryPoints、CommonsChunkPluginです。レストコンフィグレーションは変更されず、上記のスターターパックから直接取得されます。

実行separatly良いサイズのangular2プロジェクトは、私は地元のメインjsのと私のプロジェクトを展開するときに、正常に動作、およびリモートベンダーとpollyfills、私が手に私はindex.htmlを

<script type="text/javascript" src="/cdn/dist/a2-bundle/polyfills.bundle.js" defer></script> 
<script type="text/javascript" src="/cdn/dist/a2-bundle/vendor.bundle.js" defer></script> 
<script type="text/javascript" src="~/ng2/dist/main.bundle.js" defer></script> 

でそれを参照する方法下記参照ブラウザでエラーが発生しました。

Uncaught TypeError: Cannot set property '_console' of undefined 
    at t (vendor.bundle.js:19) 
    at Object.984 (main.bundle.js:1) 
    at n (polyfills.bundle.js:1) 
    at Object.990 (main.bundle.js:1) 
    at n (polyfills.bundle.js:1) 
    at Object.988 (main.bundle.js:1) 
    at n (polyfills.bundle.js:1) 
    at Object.1013 (main.bundle.js:1) 
    at n (polyfills.bundle.js:1) 
    at window.webpackJsonp (polyfills.bundle.js:1) 
    at main.bundle.js:1 

私はこれを動作させるために検索しましたが、そうすることはできません。 webpackはバンドルの構築中にすべてのモジュールに一意のIDを提供するので、ここでは構成のパスを使用しています。

あなたはどう思いますか? その他の代替/ソリューションは、最も私が

を歓迎している私は確かに間違った方向に行っていたユースケースのようなタイプのために........

答えて

0

、ありがとうございました。
DLLPlugin(CDN)とDLLReferencePlugin(クライアント側)が私の問題を解決しました。