2017-02-20 6 views
0

Ich habe an einem Angular 2/Webpack-Projekt gearbeitet, das ich über eine Vorlage gekauft habe, die bereits einen Webpack-Entwicklungs- und Produktionsserver hatte. Sie gehen wie folgt:Konfigurieren eines Express-Servers für die Bereitstellung meiner Webpack-Produktionsumgebung

webpack.config.js:

// Look in ./config folder for webpack.dev.js 
switch (process.env.NODE_ENV) { 
    case 'prod': 
    case 'production': 
    module.exports = require('./config/webpack.prod')({env: 'production'}); 
    break; 
    case 'dev': 
    case 'development': 
    default: 
    module.exports = require('./config/webpack.dev')({env: 'development'}); 
} 

webpack.common.js:

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'); 

/* 
* Webpack Constants 
*/ 
const HMR = helpers.hasProcessFlag('hot'); 
const AOT = helpers.hasNpmFlag('aot'); 
const METADATA = { 
    title: 'Sing App 3.2.0 with Angular 2.0 Final Release support by Flatlogic', 
    baseUrl: '/', 
    isDevServer: helpers.isWebpackDevServer() 
}; 

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

    /* 
    * 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: { 

     /* 
     * An array of automatically applied loaders. 
     * 
     * IMPORTANT: The loaders here are resolved relative to the resource which they are applied to. 
     * This means they are not resolved relative to the configuration file. 
     * 
     * See: http://webpack.github.io/docs/configuration.html#module-loaders 
     */ 
     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', 
      'angular-router-loader?loader=system&genDir=compiled/src/app&aot=' + AOT 
      ], 
      exclude: [/\.(spec|e2e)\.ts$/] 
     }, 

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

     { test: /\.scss$/, use: ['raw-loader', 'sass-loader'] }, 

     { test: /\.(woff2?|ttf|eot|svg)$/, use: 'url?limit=10000&name=[name].[ext]' }, 

     // Bootstrap 4 
     { test: /bootstrap\/dist\/js\/umd\//, use: 'imports?jQuery=jquery' }, 

     /* 
     * to string and css loader support for *.css files 
     * Returns file content as string 
     * 
     */ 
     { 
      test: /\.css$/, 
      use: ['to-string-loader', 'css-loader'] 
     }, 

     /* 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' 
     }, 
     { 
      noParse: [ 
      /aws-sdk/, 
      ] 
     } 
     ] 
    }, 

    /* 
    * 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 
     */ 
     new CommonsChunkPlugin({ 
     name: ['polyfills', 'vendor'].reverse() 
     }), 

     /** 
     * 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' 
     }]), 

     /* 
     * 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' 
     }), 

     new ScriptExtHtmlWebpackPlugin({ 
     defaultAttribute: 'defer' 
     }), 

     /* 
     * Plugin: ProvidePlugin 
     * Description: Automatically loaded modules. Module (value) is loaded when the identifier (key) 
     * is used as free variable in a module. The identifier is filled with the exports of the loaded module. 
     * 
     * See: https://webpack.github.io/docs/list-of-plugins.html#provideplugin 
     */ 
     new webpack.ProvidePlugin({ 
     jQuery: 'jquery', 
     $: 'jquery', 
     jquery: 'jquery', 
     'window.jQuery': 'jquery', 
     Tether: 'tether', 
     'window.Tether': 'tether', 
     Hammer: 'hammerjs/hammer', 
     Shuffle: 'shufflejs', 
     d3: 'd3', 
     Rickshaw: 'rickshaw', 
     nv: 'nvd3', 
     moment: 'moment', 
     fullCalendar: 'fullcalendar', 
     Raphael: 'webpack-raphael', 
     'window.Raphael': 'webpack-raphael', 
     Skycons: 'skycons/skycons', 
     Dropzone: 'dropzone' 
     }), 

     /* 
     * Plugin: HtmlHeadConfigPlugin 
     * 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') 
     }), 

     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') 
    ) 
    ], 

    /* 
    * 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 
    } 

    }; 
} 

und webpack.prod.js:

const helpers = require('./helpers'); 
const webpackMerge = require('webpack-merge'); // used to merge webpack configs 
const commonConfig = require('./webpack.common.js'); // the settings that are common to prod and dev 

/** 
* Webpack Plugins 
*/ 
const DedupePlugin = require('webpack/lib/optimize/DedupePlugin'); 
const DefinePlugin = require('webpack/lib/DefinePlugin'); 
const IgnorePlugin = require('webpack/lib/IgnorePlugin'); 
const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); 
const NormalModuleReplacementPlugin = require('webpack/lib/NormalModuleReplacementPlugin'); 
const ProvidePlugin = require('webpack/lib/ProvidePlugin'); 
const UglifyJsPlugin = require('webpack/lib/optimize/UglifyJsPlugin'); 
const WebpackMd5Hash = require('webpack-md5-hash'); 
const V8LazyParseWebpackPlugin = require('v8-lazy-parse-webpack-plugin'); 

/** 
* Webpack Constants 
*/ 
const ENV = process.env.NODE_ENV = process.env.ENV = 'production'; 
const HOST = process.env.HOST || 'localhost'; 
const PORT = process.env.PORT || 8080; 
const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, { 
    host: HOST, 
    port: PORT, 
    ENV: ENV, 
    HMR: false 
}); 

module.exports = function(env) { 
    return webpackMerge(commonConfig({env: ENV}), { 
    /** 
    * Developer tool to enhance debugging 
    * 
    * See: http://webpack.github.io/docs/configuration.html#devtool 
    * See: https://github.com/webpack/docs/wiki/build-performance#sourcemaps 
    */ 
    devtool: 'source-map', 

    /** 
    * Options affecting the output of the compilation. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#output 
    */ 
    output: { 

     /** 
     * The output directory as absolute path (required). 
     * 
     * See: http://webpack.github.io/docs/configuration.html#output-path 
     */ 
     path: helpers.root('dist'), 

     /** 
     * Specifies the name of each output file on disk. 
     * IMPORTANT: You must not specify an absolute path here! 
     * 
     * See: http://webpack.github.io/docs/configuration.html#output-filename 
     */ 
     filename: '[name].[chunkhash].bundle.js', 

     /** 
     * The filename of the SourceMaps for the JavaScript files. 
     * They are inside the output.path directory. 
     * 
     * See: http://webpack.github.io/docs/configuration.html#output-sourcemapfilename 
     */ 
     sourceMapFilename: '[name].[chunkhash].bundle.map', 

     /** 
     * The filename of non-entry chunks as relative path 
     * inside the output.path directory. 
     * 
     * See: http://webpack.github.io/docs/configuration.html#output-chunkfilename 
     */ 
     chunkFilename: '[id].[chunkhash].chunk.js' 

    }, 

    /** 
    * Add additional plugins to the compiler. 
    * 
    * See: http://webpack.github.io/docs/configuration.html#plugins 
    */ 
    plugins: [ 
     /** 
     * Plugin: WebpackMd5Hash 
     * Description: Plugin to replace a standard webpack chunkhash with md5. 
     * 
     * See: https://www.npmjs.com/package/webpack-md5-hash 
     */ 
     new WebpackMd5Hash(), 
     /** 
     * Plugin: DefinePlugin 
     * Description: Define free variables. 
     * Useful for having development builds with debug logging or adding global constants. 
     * 
     * Environment helpers 
     * 
     * See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin 
     */ 
     // NOTE: when adding more properties make sure you include them in custom-typings.d.ts 
     new DefinePlugin({ 
     'ENV': JSON.stringify(METADATA.ENV), 
     'HMR': METADATA.HMR, 
     'process.env': { 
      'ENV': JSON.stringify(METADATA.ENV), 
      'NODE_ENV': JSON.stringify(METADATA.ENV), 
      'HMR': METADATA.HMR, 
     } 
     }), 
     /** 
     * Plugin: UglifyJsPlugin 
     * Description: Minimize all JavaScript output of chunks. 
     * Loaders are switched into minimizing mode. 
     * 
     * See: https://webpack.github.io/docs/list-of-plugins.html#uglifyjsplugin 
     */ 
     // NOTE: To debug prod builds uncomment //debug lines and comment //prod lines 
     new UglifyJsPlugin({ 
     beautify: false, //prod 
     mangle: { screw_ie8 : true, keep_fnames: true, except: ['$super'] }, //prod 
     compress: { 
      screw_ie8: true, 
      warnings: false, 
      conditionals: true, 
      unused: true, 
      comparisons: true, 
      sequences: true, 
      dead_code: true, 
      evaluate: true, 
      if_return: true, 
      join_vars: true, 
      negate_iife: false // we need this for lazy v8 
     }, //prod 
     comments: false //prod 
     }), 

     /** 
     * Plugin: NormalModuleReplacementPlugin 
     * Description: Replace resources that matches resourceRegExp with newResource 
     * 
     * See: http://webpack.github.io/docs/list-of-plugins.html#normalmodulereplacementplugin 
     */ 

     new NormalModuleReplacementPlugin(
     /angular2-hmr/, 
     helpers.root('config/empty.js') 
    ), 

     new NormalModuleReplacementPlugin(
     /zone\.js(\\|\/)dist(\\|\/)long-stack-trace-zone/, 
     helpers.root('config/empty.js') 
    ), 

     // AoT 
     // new NormalModuleReplacementPlugin(
     // /@angular(\\|\/)upgrade/, 
     // helpers.root('config/empty.js') 
     //), 
     // new NormalModuleReplacementPlugin(
     // /@angular(\\|\/)compiler/, 
     // helpers.root('config/empty.js') 
     //), 
     // new NormalModuleReplacementPlugin(
     // /@angular(\\|\/)platform-browser-dynamic/, 
     // helpers.root('config/empty.js') 
     //), 
     // new NormalModuleReplacementPlugin(
     // /dom(\\|\/)debug(\\|\/)ng_probe/, 
     // helpers.root('config/empty.js') 
     //), 
     // new NormalModuleReplacementPlugin(
     // /dom(\\|\/)debug(\\|\/)by/, 
     // helpers.root('config/empty.js') 
     //), 
     // new NormalModuleReplacementPlugin(
     // /src(\\|\/)debug(\\|\/)debug_node/, 
     // helpers.root('config/empty.js') 
     //), 
     // new NormalModuleReplacementPlugin(
     // /src(\\|\/)debug(\\|\/)debug_renderer/, 
     // helpers.root('config/empty.js') 
     //), 

     /** 
     * Plugin: IgnorePlugin 
     * Description: Don’t generate modules for requests matching the provided RegExp. 
     * 
     * See: http://webpack.github.io/docs/list-of-plugins.html#ignoreplugin 
     */ 

     // new IgnorePlugin(/angular2-hmr/), 

     /** 
     * Plugin: CompressionPlugin 
     * Description: Prepares compressed versions of assets to serve 
     * them with Content-Encoding 
     * 
     * See: https://github.com/webpack/compression-webpack-plugin 
     */ 
     // install compression-webpack-plugin 
     // new CompressionPlugin({ 
     // regExp: /\.css$|\.html$|\.js$|\.map$/, 
     // threshold: 2 * 1024 
     // }) 

     new LoaderOptionsPlugin({ 
     minimize: true, 
     debug: false, 
     options: { 

      /** 
      * Html loader advanced options 
      * 
      * See: https://github.com/webpack/html-loader#advanced-options 
      */ 
      // TODO: Need to workaround Angular 2's html syntax => #id [bind] (event) *ngFor 
      htmlLoader: { 
      minimize: true, 
      removeAttributeQuotes: false, 
      caseSensitive: true, 
      customAttrSurround: [ 
       [/#/, /(?:)/], 
       [/\*/, /(?:)/], 
       [/\[?\(?/, /(?:)/] 
      ], 
      customAttrAssign: [/\)?\]?=/] 
      } 
     } 
     }) 

    ], 

    /* 
    * 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: false, 
     module: false, 
     clearImmediate: false, 
     setImmediate: false 
    } 
    }); 
}; 

Entschuldigung wenn es TL ist, DR. Ich bin ziemlich neu in Webpack und ich möchte in der Lage sein, meine eckige App über einen anderen Express-Server zu bedienen, den ich erstelle, der auch meine REST API bedient. Ich wollte den Webpack-Produktionsserver und meinen Express-Server in separaten Umgebungen haben, aber ich wollte sehen, ob das überhaupt möglich war und wenn ja, wie.

Antwort

0

So gibt es zwei Möglichkeiten, es

  1. laufen auf einem Port, Front-End (webpack) auf eine andere ... in der Regel in zwei Registerkarten in Ihrem Browser ausdrücken zu tun (wenn Sie Ihre api sehen wollen)
  2. Verwenden Sie Webpack, um den Express-Server als Proxy zu verwenden, sodass Sie beide auf demselben Port "ausführen" können.

Methode # 2 ist komplizierter einzurichten, aber das Wesentliche ist:

webpack.config.js var config = {

// webpack stuff here ... 

    //dev server configuration 
    devServer: { 

    // ... 

    // every request made to 'locahost:8080/api/xxxx' will be proxyfied to 'http://localhost:7000/api/xxxx' 
    proxy: { 
     "/api/*": { 
     target: "http://localhost:7000", 
     secure: false, 
     rewrite: function(req, options) { 
      //you can handle rewrite here if you need to   
     } 
     }, 

    } 
    }, 
// 
}; 

module.exports = config; 
+0

Sie eine ausführlichere Erklärung sehen können http://blog.npirotte.be/a-strong-webpack-configuration-part-2/ – redconservatory

+0

Ich führe dies derzeit auf einer ec2 t2.micro-Instanz, ich habe den Webpack-Server schon da oben und musste es tun Erstellen Sie einen Speicheraustausch, da der Speicher schnell verbraucht wird. Würden 2 Knoten-Server auf dem Server zu einem Problem werden? –

+0

willst du deine statischen (clientseitigen) Sachen nicht auf S3 oder Cloudfront stellen? – redconservatory

Verwandte Themen