Skip to content

Commit a1bbe3c

Browse files
committed
修改(webpack):打包方式
1 parent 2759402 commit a1bbe3c

File tree

5 files changed

+223
-1
lines changed

5 files changed

+223
-1
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.DS_Store
22
node_modules/
33
/dist/
4+
/demo
45
npm-debug.log*
56
yarn-debug.log*
67
yarn-error.log*

build/demo.js

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
'use strict'
2+
require('./check-versions')()
3+
4+
process.env.NODE_ENV = 'production'
5+
6+
const ora = require('ora')
7+
const rm = require('rimraf')
8+
const path = require('path')
9+
const chalk = require('chalk')
10+
const webpack = require('webpack')
11+
const config = require('../config')
12+
const webpackConfig = require('./webpack.demo.conf')
13+
14+
const spinner = ora('building for production...')
15+
spinner.start()
16+
17+
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
18+
if (err) throw err
19+
webpack(webpackConfig, (err, stats) => {
20+
spinner.stop()
21+
if (err) throw err
22+
process.stdout.write(stats.toString({
23+
colors: true,
24+
modules: false,
25+
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
26+
chunks: false,
27+
chunkModules: false
28+
}) + '\n\n')
29+
30+
if (stats.hasErrors()) {
31+
console.log(chalk.red(' Build failed with errors.\n'))
32+
process.exit(1)
33+
}
34+
35+
console.log(chalk.cyan(' Build complete.\n'))
36+
console.log(chalk.yellow(
37+
' Tip: built files are meant to be served over an HTTP server.\n' +
38+
' Opening index.html over file:// won\'t work.\n'
39+
))
40+
})
41+
})

build/webpack.demo.conf.js

+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
'use strict'
2+
const path = require('path')
3+
const utils = require('./utils')
4+
const webpack = require('webpack')
5+
const config = require('../config')
6+
const merge = require('webpack-merge')
7+
const baseWebpackConfig = require('./webpack.base.conf')
8+
const CopyWebpackPlugin = require('copy-webpack-plugin')
9+
const HtmlWebpackPlugin = require('html-webpack-plugin')
10+
const ExtractTextPlugin = require('extract-text-webpack-plugin')
11+
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
12+
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
13+
const env = process.env.NODE_ENV === 'testing'
14+
? require('../config/test.env')
15+
: require('../config/prod.env')
16+
17+
const webpackConfig = merge(baseWebpackConfig, {
18+
module: {
19+
rules: utils.styleLoaders({
20+
sourceMap: config.demo.productionSourceMap,
21+
extract: true,
22+
usePostCSS: true
23+
})
24+
},
25+
devtool: config.demo.productionSourceMap ? config.demo.devtool : false,
26+
output: {
27+
path: config.demo.assetsRoot,
28+
filename: utils.assetsPath('js/[name].[chunkhash].js'),
29+
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
30+
},
31+
plugins: [
32+
// http://vuejs.github.io/vue-loader/en/workflow/production.html
33+
new webpack.DefinePlugin({
34+
'process.env': env
35+
}),
36+
new UglifyJsPlugin({
37+
uglifyOptions: {
38+
compress: {
39+
warnings: false
40+
}
41+
},
42+
sourceMap: config.demo.productionSourceMap,
43+
parallel: true
44+
}),
45+
// extract css into its own file
46+
new ExtractTextPlugin({
47+
filename: utils.assetsPath('css/[name].[contenthash].css'),
48+
// Setting the following option to `false` will not extract CSS from codesplit chunks.
49+
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
50+
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
51+
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
52+
allChunks: true,
53+
}),
54+
// Compress extracted CSS. We are using this plugin so that possible
55+
// duplicated CSS from different components can be deduped.
56+
new OptimizeCSSPlugin({
57+
cssProcessorOptions: config.demo.productionSourceMap
58+
? { safe: true, map: { inline: false } }
59+
: { safe: true }
60+
}),
61+
// generate dist index.html with correct asset hash for caching.
62+
// you can customize output by editing /index.html
63+
// see https://github.com/ampedandwired/html-webpack-plugin
64+
new HtmlWebpackPlugin({
65+
filename: process.env.NODE_ENV === 'testing'
66+
? 'index.html'
67+
: config.demo.index,
68+
template: 'index.html',
69+
inject: true,
70+
minify: {
71+
removeComments: true,
72+
collapseWhitespace: true,
73+
removeAttributeQuotes: true
74+
// more options:
75+
// https://github.com/kangax/html-minifier#options-quick-reference
76+
},
77+
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
78+
chunksSortMode: 'dependency'
79+
}),
80+
// keep module.id stable when vendor modules does not change
81+
new webpack.HashedModuleIdsPlugin(),
82+
// enable scope hoisting
83+
new webpack.optimize.ModuleConcatenationPlugin(),
84+
// split vendor js into its own file
85+
new webpack.optimize.CommonsChunkPlugin({
86+
name: 'vendor',
87+
minChunks (module) {
88+
// any required modules inside node_modules are extracted to vendor
89+
return (
90+
module.resource &&
91+
/\.js$/.test(module.resource) &&
92+
module.resource.indexOf(
93+
path.join(__dirname, '../node_modules')
94+
) === 0
95+
)
96+
}
97+
}),
98+
// extract webpack runtime and module manifest to its own file in order to
99+
// prevent vendor hash from being updated whenever app bundle is updated
100+
new webpack.optimize.CommonsChunkPlugin({
101+
name: 'manifest',
102+
minChunks: Infinity
103+
}),
104+
// This instance extracts shared chunks from code splitted chunks and bundles them
105+
// in a separate chunk, similar to the vendor chunk
106+
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
107+
new webpack.optimize.CommonsChunkPlugin({
108+
name: 'app',
109+
async: 'vendor-async',
110+
children: true,
111+
minChunks: 3
112+
}),
113+
114+
// copy custom static assets
115+
new CopyWebpackPlugin([
116+
{
117+
from: path.resolve(__dirname, '../static'),
118+
to: config.demo.assetsSubDirectory,
119+
ignore: ['.*']
120+
}
121+
])
122+
]
123+
})
124+
125+
if (config.demo.productionGzip) {
126+
const CompressionWebpackPlugin = require('compression-webpack-plugin')
127+
128+
webpackConfig.plugins.push(
129+
new CompressionWebpackPlugin({
130+
asset: '[path].gz[query]',
131+
algorithm: 'gzip',
132+
test: new RegExp(
133+
'\\.(' +
134+
config.demo.productionGzipExtensions.join('|') +
135+
')$'
136+
),
137+
threshold: 10240,
138+
minRatio: 0.8
139+
})
140+
)
141+
}
142+
143+
if (config.demo.bundleAnalyzerReport) {
144+
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
145+
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
146+
}
147+
148+
module.exports = webpackConfig

config/index.js

+31
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,37 @@ module.exports = {
6767
productionGzip: false,
6868
productionGzipExtensions: ['js', 'css'],
6969

70+
// Run the build command with an extra argument to
71+
// View the bundle analyzer report after build finishes:
72+
// `npm run build --report`
73+
// Set to `true` or `false` to always turn it on or off
74+
bundleAnalyzerReport: process.env.npm_config_report
75+
},
76+
77+
demo: {
78+
// Template for index.html
79+
index: path.resolve(__dirname, '../demo/index.html'),
80+
81+
// Paths
82+
assetsRoot: path.resolve(__dirname, '../demo'),
83+
assetsSubDirectory: 'static',
84+
assetsPublicPath: '/',
85+
86+
/**
87+
* Source Maps
88+
*/
89+
90+
productionSourceMap: true,
91+
// https://webpack.js.org/configuration/devtool/#production
92+
devtool: '#source-map',
93+
94+
// Gzip off by default as many popular static hosts such as
95+
// Surge or Netlify already gzip all static assets for you.
96+
// Before setting to `true`, make sure to:
97+
// npm install --save-dev compression-webpack-plugin
98+
productionGzip: false,
99+
productionGzipExtensions: ['js', 'css'],
100+
70101
// Run the build command with an extra argument to
71102
// View the bundle analyzer report after build finishes:
72103
// `npm run build --report`

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
"e2e": "node test/e2e/runner.js",
2222
"test": "npm run unit && npm run e2e",
2323
"lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
24-
"build": "node build/build.js"
24+
"build": "node build/build.js",
25+
"demo": "node build/demo.js"
2526
},
2627
"dependencies": {
2728
"diff": "^3.5.0",

0 commit comments

Comments
 (0)