module.exports = {
+ hmrModule: function (ngmodule) {
+ return ngmodule
+ },
NgProbeToken: {},
HmrState: function () {},
_createConditionalRootRenderer: function (rootRenderer, extraTokens, coreTokens) {
const WebpackNotifierPlugin = require('webpack-notifier')
-/*
- * Webpack Constants
- */
+const HMR = helpers.hasProcessFlag('hot')
+const AOT = process.env.BUILD_AOT || helpers.hasNpmFlag('aot')
const METADATA = {
title: 'PeerTube',
baseUrl: '/',
- isDevServer: helpers.isWebpackDevServer()
+ isDevServer: helpers.isWebpackDevServer(),
+ HMR: HMR,
+ AOT: AOT
}
/*
{
test: /\.ts$/,
use: [
- {
- loader: '@angularclass/hmr-loader',
- options: {
- pretty: !isProd,
- prod: isProd
- }
- },
{
loader: 'ng-router-loader',
options: {
/**
* The (\\|\/) piece accounts for path separators in *nix and Windows
*/
- /angular(\\|\/)core(\\|\/)@angular/,
+ /(.+)?angular(\\|\/)core(.+)?/,
helpers.root('src'), // location of your src
{
/**
new HtmlWebpackPlugin({
template: 'src/index.html',
title: METADATA.title,
- chunksSortMode: 'dependency',
+ chunksSortMode: function (a, b) {
+ const entryPoints = [ 'inline', 'polyfills', 'sw-register', 'styles', 'vendor', 'main' ]
+ return entryPoints.indexOf(a.names[0]) - entryPoints.indexOf(b.names[0])
+ },
metadata: METADATA,
inject: 'body'
}),
const DefinePlugin = require('webpack/lib/DefinePlugin')
const NamedModulesPlugin = require('webpack/lib/NamedModulesPlugin')
const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin')
+const HotModuleReplacementPlugin = require('webpack/lib/HotModuleReplacementPlugin')
/**
* Webpack Constants
const ENV = process.env.ENV = process.env.NODE_ENV = 'development'
const HOST = process.env.HOST || 'localhost'
const PORT = process.env.PORT || 3000
+const PUBLIC = process.env.PUBLIC_DEV || HOST + ':' + PORT
+const AOT = process.env.BUILD_AOT || helpers.hasNpmFlag('aot')
const HMR = helpers.hasProcessFlag('hot')
-const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, {
+const METADATA = {
host: HOST,
port: PORT,
+ public: PUBLIC,
ENV: ENV,
HMR: HMR,
+ AOT: AOT,
API_URL: 'http://localhost:9000'
-})
+}
const DllBundlesPlugin = require('webpack-dll-bundles-plugin').DllBundlesPlugin
'HMR': METADATA.HMR,
'API_URL': JSON.stringify(METADATA.API_URL),
'process.version': JSON.stringify(process.version),
- 'process.env': {
- 'ENV': JSON.stringify(METADATA.ENV),
- 'NODE_ENV': JSON.stringify(METADATA.ENV),
- 'HMR': METADATA.HMR
- }
+ 'process.env.ENV': JSON.stringify(METADATA.ENV),
+ 'process.env.NODE_ENV': JSON.stringify(METADATA.ENV),
+ 'process.env.HMR': METADATA.HMR
}),
new DllBundlesPlugin({
}
}
- })
+ }),
+ new HotModuleReplacementPlugin()
],
/**
port: METADATA.port,
host: METADATA.host,
historyApiFallback: true,
+ hot: METADATA.HMR,
watchOptions: {
ignored: /node_modules/
}
const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin')
const NormalModuleReplacementPlugin = require('webpack/lib/NormalModuleReplacementPlugin')
const OptimizeJsPlugin = require('optimize-js-plugin')
-const UglifyJsPlugin = require('webpack/lib/optimize/UglifyJsPlugin')
const HashedModuleIdsPlugin = require('webpack/lib/HashedModuleIdsPlugin')
-
+const ModuleConcatenationPlugin = require('webpack/lib/optimize/ModuleConcatenationPlugin')
+const UglifyJsPlugin = require('uglifyjs-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, {
+const AOT = process.env.BUILD_AOT || helpers.hasNpmFlag('aot')
+const METADATA = {
host: HOST,
port: PORT,
ENV: ENV,
HMR: false,
+ AOT: AOT,
API_URL: ''
-})
+}
module.exports = function (env) {
return [
* See: http://webpack.github.io/docs/configuration.html#plugins
*/
plugins: [
+ new ModuleConcatenationPlugin(),
/**
* Webpack plugin to optimize a JavaScript file for faster initial load
'ENV': JSON.stringify(METADATA.ENV),
'HMR': METADATA.HMR,
'API_URL': JSON.stringify(METADATA.API_URL),
+ 'AOT': METADATA.AOT,
'process.version': JSON.stringify(process.version),
- 'process.env': {
- 'ENV': JSON.stringify(METADATA.ENV),
- 'NODE_ENV': JSON.stringify(METADATA.ENV),
- 'HMR': METADATA.HMR
- }
+ 'process.env.ENV': JSON.stringify(METADATA.ENV),
+ 'process.env.NODE_ENV': JSON.stringify(METADATA.ENV),
+ 'process.env.HMR': METADATA.HMR
}),
/**
*/
// NOTE: To debug prod builds uncomment //debug lines and comment //prod lines
new UglifyJsPlugin({
- // beautify: true, //debug
- // mangle: false, //debug
- // dead_code: false, //debug
- // unused: false, //debug
- // deadCode: false, //debug
- // compress: {
- // screw_ie8: true,
- // keep_fnames: true,
- // drop_debugger: false,
- // dead_code: false,
- // unused: false
- // }, // debug
- // comments: true, //debug
-
- beautify: false, // prod
- output: {
- comments: false
- }, // prod
- mangle: {
- screw_ie8: true
- }, // 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
- }
+ parallel: true,
+ uglifyOptions: {
+ ie8: false,
+ ecma: 6,
+ warnings: true,
+ mangle: true,
+ output: {
+ comments: false,
+ beautify: false
+ }
+ },
+ warnings: true
}),
+ /**
+ * 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/,
+ /(angular2|@angularclass)((\\|\/)|-)hmr/,
helpers.root('config/empty.js')
),
new HashedModuleIdsPlugin(),
/**
- * 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
+ * AoT
*/
- // install compression-webpack-plugin
- // new CompressionPlugin({
- // regExp: /\.css$|\.html$|\.js$|\.map$/,
- // threshold: 2 * 1024
- // })
+ (AOT ? (
+ new NormalModuleReplacementPlugin(
+ /@angular(\\|\/)compiler/,
+ helpers.root('config/empty.js')
+ )
+ ) : (new LoaderOptionsPlugin({}))),
/**
* Plugin LoaderOptionsPlugin (experimental)
"purifycss-webpack": "^0.7.0",
"standard": "^10.0.0",
"tslint-config-standard": "^6.0.1",
+ "uglifyjs-webpack-plugin": "^0.4.6",
"webpack-bundle-analyzer": "^2.8.2",
"webpack-dev-server": "^2.4.5",
"webpack-dll-bundles-plugin": "^1.0.0-beta.5"
import { NgModule } from '@angular/core'
-import { Routes, RouterModule } from '@angular/router'
+import { Routes, RouterModule, PreloadAllModules } from '@angular/router'
const routes: Routes = [
{
]
@NgModule({
- imports: [ RouterModule.forRoot(routes) ],
+ imports: [
+ RouterModule.forRoot(routes, {
+ useHash: Boolean(history.pushState) === false,
+ preloadingStrategy: PreloadAllModules
+ })
+ ],
exports: [ RouterModule ]
})
export class AppRoutingModule {}
/* tslint: disable */
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
-import { decorateModuleRef } from './app/environment';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
+import { decorateModuleRef } from './app/environment'
+import { hmrModule } from '@angularclass/hmr'
/**
* App Module
* our top level module that holds all of our components
*/
-import { AppModule } from './app';
+import { AppModule } from './app'
/**
* Bootstrap our Angular app with a top level NgModule
*/
-export function main(): Promise<any> {
+export function main (): Promise<any> {
return platformBrowserDynamic()
.bootstrapModule(AppModule)
.then(decorateModuleRef)
- .catch((err) => console.error(err));
+ .then((ngModuleRef: any) => {
+ // `module` global ref for webpackhmr
+ // Don't run this in Prod
+ return hmrModule(ngModuleRef, module)
+ })
+ .catch((err) => console.error(err))
}
/**
*/
switch (document.readyState) {
case 'loading':
- document.addEventListener('DOMContentLoaded', _domReadyHandler, false);
- break;
+ document.addEventListener('DOMContentLoaded', _domReadyHandler, false)
+ break
case 'interactive':
case 'complete':
default:
- main();
+ main()
}
-function _domReadyHandler() {
- document.removeEventListener('DOMContentLoaded', _domReadyHandler, false);
- main();
+function _domReadyHandler () {
+ document.removeEventListener('DOMContentLoaded', _domReadyHandler, false)
+ main()
}
cd client || exit -1
-npm run webpack-dev-server -- --config config/webpack.dev.js --progress --profile --colors --watch --content-base src/ --inline --hot --open
+npm run webpack-dev-server -- --config config/webpack.dev.js --progress --profile --colors --watch --content-base src/ --hotOnly --open