mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-25 16:57:51 +08:00
Before: ``` $ ng build --no-progress Hash: ff03df269349b817eef4 Time: 11202ms chunk {0} 0.chunk.js, 0.chunk.js.map 1.61 kB {1} {3} [rendered] chunk {1} 1.chunk.js, 1.chunk.js.map 1.46 kB {0} {3} [rendered] chunk {2} polyfills.bundle.js, polyfills.bundle.js.map (polyfills) 160 kB {6} [initial] [rendered] chunk {3} main.bundle.js, main.bundle.js.map (main) 6.38 kB {5} [initial] [rendered] chunk {4} styles.bundle.js, styles.bundle.js.map (styles) 10.5 kB {6} [initial] [rendered] chunk {5} vendor.bundle.js, vendor.bundle.js.map (vendor) 2.16 MB [initial] [rendered] chunk {6} inline.bundle.js, inline.bundle.js.map (inline) 0 bytes [entry] [rendered] ``` After: ``` $ ng build --no-progress Hash: 2bc12a89f40f3b4818b5 Time: 9613ms chunk {feature.module} feature.module.chunk.js, feature.module.chunk.js.map 1.46 kB {lazy.module} {main} [rendered] chunk {inline} inline.bundle.js, inline.bundle.js.map (inline) 0 bytes [entry] [rendered] chunk {lazy.module} lazy.module.chunk.js, lazy.module.chunk.js.map 1.61 kB {feature.module} {main} [rendered] chunk {main} main.bundle.js, main.bundle.js.map (main) 6.38 kB {vendor} [initial] [rendered] chunk {polyfills} polyfills.bundle.js, polyfills.bundle.js.map (polyfills) 160 kB {inline} [initial] [rendered] chunk {styles} styles.bundle.js, styles.bundle.js.map (styles) 10.5 kB {inline} [initial] [rendered] chunk {vendor} vendor.bundle.js, vendor.bundle.js.map (vendor) 2.16 MB [initial] [rendered] ``` Fix #6700
129 lines
3.9 KiB
TypeScript
129 lines
3.9 KiB
TypeScript
import * as webpack from 'webpack';
|
|
import * as path from 'path';
|
|
import { GlobCopyWebpackPlugin } from '../../plugins/glob-copy-webpack-plugin';
|
|
import { NamedLazyChunksWebpackPlugin } from '../../plugins/named-lazy-chunks-webpack-plugin';
|
|
import { extraEntryParser, getOutputHashFormat } from './utils';
|
|
import { WebpackConfigOptions } from '../webpack-config';
|
|
|
|
const ProgressPlugin = require('webpack/lib/ProgressPlugin');
|
|
const CircularDependencyPlugin = require('circular-dependency-plugin');
|
|
|
|
|
|
/**
|
|
* Enumerate loaders and their dependencies from this file to let the dependency validator
|
|
* know they are used.
|
|
*
|
|
* require('source-map-loader')
|
|
* require('raw-loader')
|
|
* require('script-loader')
|
|
* require('json-loader')
|
|
* require('url-loader')
|
|
* require('file-loader')
|
|
*/
|
|
|
|
export function getCommonConfig(wco: WebpackConfigOptions) {
|
|
const { projectRoot, buildOptions, appConfig } = wco;
|
|
|
|
const appRoot = path.resolve(projectRoot, appConfig.root);
|
|
const nodeModules = path.resolve(projectRoot, 'node_modules');
|
|
|
|
let extraPlugins: any[] = [];
|
|
let extraRules: any[] = [];
|
|
let entryPoints: { [key: string]: string[] } = {};
|
|
|
|
if (appConfig.main) {
|
|
entryPoints['main'] = [path.resolve(appRoot, appConfig.main)];
|
|
}
|
|
|
|
if (appConfig.polyfills) {
|
|
entryPoints['polyfills'] = [path.resolve(appRoot, appConfig.polyfills)];
|
|
}
|
|
|
|
// determine hashing format
|
|
const hashFormat = getOutputHashFormat(buildOptions.outputHashing);
|
|
|
|
// process global scripts
|
|
if (appConfig.scripts.length > 0) {
|
|
const globalScripts = extraEntryParser(appConfig.scripts, appRoot, 'scripts');
|
|
|
|
// add entry points and lazy chunks
|
|
globalScripts.forEach(script => {
|
|
let scriptPath = `script-loader!${script.path}`;
|
|
entryPoints[script.entry] = (entryPoints[script.entry] || []).concat(scriptPath);
|
|
});
|
|
}
|
|
|
|
// process asset entries
|
|
if (appConfig.assets) {
|
|
extraPlugins.push(new GlobCopyWebpackPlugin({
|
|
patterns: appConfig.assets,
|
|
globOptions: { cwd: appRoot, dot: true, ignore: '**/.gitkeep' }
|
|
}));
|
|
}
|
|
|
|
if (buildOptions.progress) {
|
|
extraPlugins.push(new ProgressPlugin({ profile: buildOptions.verbose, colors: true }));
|
|
}
|
|
|
|
if (buildOptions.sourcemaps) {
|
|
extraPlugins.push(new webpack.SourceMapDevToolPlugin({
|
|
filename: '[file].map[query]',
|
|
moduleFilenameTemplate: '[resource-path]',
|
|
fallbackModuleFilenameTemplate: '[resource-path]?[hash]',
|
|
sourceRoot: 'webpack:///'
|
|
}));
|
|
}
|
|
|
|
if (buildOptions.showCircularDependencies) {
|
|
extraPlugins.push(new CircularDependencyPlugin({
|
|
exclude: /(\\|\/)node_modules(\\|\/)/
|
|
}));
|
|
}
|
|
|
|
return {
|
|
resolve: {
|
|
extensions: ['.ts', '.js'],
|
|
modules: ['node_modules', nodeModules],
|
|
symlinks: !buildOptions.preserveSymlinks
|
|
},
|
|
resolveLoader: {
|
|
modules: [nodeModules, 'node_modules']
|
|
},
|
|
context: __dirname,
|
|
entry: entryPoints,
|
|
output: {
|
|
path: path.resolve(projectRoot, buildOptions.outputPath),
|
|
publicPath: buildOptions.deployUrl,
|
|
filename: `[name]${hashFormat.chunk}.bundle.js`,
|
|
chunkFilename: `[id]${hashFormat.chunk}.chunk.js`
|
|
},
|
|
module: {
|
|
rules: [
|
|
{ enforce: 'pre', test: /\.js$/, loader: 'source-map-loader', exclude: [nodeModules] },
|
|
{ test: /\.json$/, loader: 'json-loader' },
|
|
{ test: /\.html$/, loader: 'raw-loader' },
|
|
{ test: /\.(eot|svg)$/, loader: `file-loader?name=[name]${hashFormat.file}.[ext]` },
|
|
{
|
|
test: /\.(jpg|png|webp|gif|otf|ttf|woff|woff2|cur|ani)$/,
|
|
loader: `url-loader?name=[name]${hashFormat.file}.[ext]&limit=10000`
|
|
}
|
|
].concat(extraRules)
|
|
},
|
|
plugins: [
|
|
new webpack.NoEmitOnErrorsPlugin(),
|
|
new NamedLazyChunksWebpackPlugin(),
|
|
].concat(extraPlugins),
|
|
node: {
|
|
fs: 'empty',
|
|
global: true,
|
|
crypto: 'empty',
|
|
tls: 'empty',
|
|
net: 'empty',
|
|
process: true,
|
|
module: false,
|
|
clearImmediate: false,
|
|
setImmediate: false
|
|
}
|
|
};
|
|
}
|