Skip to content

Commit 2baa8ec

Browse files
committed
feat: 集成dev和build命令
1 parent 175d3eb commit 2baa8ec

4 files changed

Lines changed: 66 additions & 27 deletions

File tree

lib/webpack.js renamed to lib/builder.js

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const baseConfig = {
3434
}
3535
};
3636

37-
class Webpack {
37+
class Builder {
3838

3939
/**
4040
* @function createDevConfig
@@ -55,32 +55,32 @@ class Webpack {
5555
// 设置打包规则
5656
const devRules = [];
5757
// 设置图片解析规则
58-
devRules.push(Webpack._setImgRule(false));
58+
devRules.push(Builder._setImgRule(false));
5959
// 设置CSS解析规则,开发环境不压缩CSS
60-
devRules.push(Webpack._setCssRule(false, options.usePx2rem, options.remUnit, options.remPrecision));
60+
devRules.push(Builder._setCssRule(false, options.usePx2rem, options.remUnit, options.remPrecision));
6161
// 设置JS解析规则
62-
devRules.push(Webpack._setJsRule());
62+
devRules.push(Builder._setJsRule());
6363

6464
// 设置打包插件
6565
let devPlugins = [];
6666
// 设置提取CSS为一个单独的文件的插件
67-
devPlugins.push(Webpack._setExtractTextPlugin(false, ''));
67+
devPlugins.push(Builder._setExtractTextPlugin(false, ''));
6868
// React, react-dom 通过cdn引入
69-
devPlugins.push(Webpack._setExternalPlugin());
69+
devPlugins.push(Builder._setExternalPlugin());
7070
// 多实例构建
7171
devPlugins.push(new HappyPack({
7272
loaders: [ 'babel-loader?presets[]=es2015,presets[]=stage-0,presets[]=react' ]
7373
}));
7474
// 多页面打包
75-
const { newEntry, htmlWebpackPlugins} = Webpack._setMultiplePage(devConfig.entry, false, options.inject, false, '', '');
75+
const { newEntry, htmlWebpackPlugins} = Builder._setMultiplePage(devConfig.entry, false, options.inject, false, '', '');
7676
devPlugins = devPlugins.concat(htmlWebpackPlugins);
7777

7878
devConfig.entry = newEntry;
79-
devConfig.output = Webpack._setOutput(false, '', '/');
79+
devConfig.output = Builder._setOutput(false, '', '/');
8080
devConfig.module.rules = devRules;
8181
devConfig.plugins = devPlugins;
82-
devConfig.devServer = Webpack._setDevServer(options.port || 8001);
83-
devConfig.resolve.alias = Webpack._setAlias();
82+
devConfig.devServer = Builder._setDevServer(options.port || 8001);
83+
devConfig.resolve.alias = Builder._setAlias();
8484

8585
return devConfig;
8686
}
@@ -116,41 +116,41 @@ class Webpack {
116116
// 设置打包规则
117117
const prodRules = [];
118118
// 设置图片解析规则, 图片需要hash
119-
prodRules.push(Webpack._setImgRule(true, assetsPrefix));
119+
prodRules.push(Builder._setImgRule(true, assetsPrefix));
120120
// 设置CSS解析规则,生产环境默认压缩CSS
121-
prodRules.push(Webpack._setCssRule(options.minifyCSS || true, options.usePx2rem, options.remUnit, options.remPrecision));
121+
prodRules.push(Builder._setCssRule(options.minifyCSS || true, options.usePx2rem, options.remUnit, options.remPrecision));
122122
// 设置JS解析规则
123-
prodRules.push(Webpack._setJsRule());
123+
prodRules.push(Builder._setJsRule());
124124

125125
// 设置打包插件
126126
let prodPlugins = [];
127127
// 清空Public目录插件
128128
prodPlugins.push(new CleanWebpackPlugin(['./public']));
129129
// 设置提取CSS为一个单独的文件的插件
130-
prodPlugins.push(Webpack._setExtractTextPlugin(true, assetsPrefix));
130+
prodPlugins.push(Builder._setExtractTextPlugin(true, assetsPrefix));
131131
if (options.minifyJS) {
132132
// 压缩JS
133133
prodPlugins.push(new webpack.optimize.UglifyJsPlugin());
134134
}
135135
// React, react-dom 通过cdn引入
136-
prodPlugins.push(Webpack._setExternalPlugin());
136+
prodPlugins.push(Builder._setExternalPlugin());
137137
// Inline 生成出来的css
138138
prodPlugins.push(new HtmlWebpackInlineSourcePlugin());
139139
// 多实例构建
140140
prodPlugins.push(new HappyPack({
141141
loaders: [ 'babel-loader?presets[]=es2015,presets[]=stage-0,presets[]=react' ]
142142
}));
143143
// 多页面打包, 默认压缩html
144-
const { newEntry, htmlWebpackPlugins} = Webpack._setMultiplePage(prodConfig.entry, options.minifyHTML || true, options.inject, false, assetsPrefix, htmlPrefix);
144+
const { newEntry, htmlWebpackPlugins} = Builder._setMultiplePage(prodConfig.entry, options.minifyHTML || true, options.inject, false, assetsPrefix, htmlPrefix);
145145

146146
prodPlugins = prodPlugins.concat(htmlWebpackPlugins);
147-
prodPlugins.push(Webpack._setOffline(assetsPrefix, htmlPrefix, cdnUrl, serverUrl));
147+
prodPlugins.push(Builder._setOffline(assetsPrefix, htmlPrefix, cdnUrl, serverUrl));
148148

149149
prodConfig.entry = newEntry;
150-
prodConfig.output = Webpack._setOutput(true, assetsPrefix, cdnUrl + '/');
150+
prodConfig.output = Builder._setOutput(true, assetsPrefix, cdnUrl + '/');
151151
prodConfig.module.rules = prodRules;
152152
prodConfig.plugins = prodPlugins;
153-
prodConfig.resolve.alias = Webpack._setAlias();
153+
prodConfig.resolve.alias = Builder._setAlias();
154154

155155
return prodConfig;
156156
}
@@ -229,7 +229,7 @@ class Webpack {
229229
const cssLoaderRule = {
230230
loader: "css-loader",
231231
options: {
232-
alias: Webpack._setAlias()
232+
alias: Builder._setAlias()
233233
}
234234
};
235235
if (minimize) {
@@ -443,4 +443,4 @@ class Webpack {
443443
}
444444
}
445445

446-
module.exports = Webpack;
446+
module.exports = Builder;

lib/index.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
11
'use strict';
22

3-
const Webpack = require('./webpack');
3+
const webpack = require('webpack');
4+
const Builder = require('./builder');
45
const Config = require('./config');
56

67
const builderOptions = Config.getBuildConfig();
8+
const devConfig = Builder.createDevConfig(builderOptions);
9+
const prodConfig = Builder.createProdConfig(builderOptions);
710

8-
exports.devConfig = Webpack.createDevConfig(builderOptions);
9-
exports.prodConfig = Webpack.createProdConfig(builderOptions);
11+
exports.devConfig = devConfig;
12+
exports.prodConfig = prodConfig;
13+
14+
module.exports = (cmd) => {
15+
if (cmd === 'dev') {
16+
require('./server')(devConfig);
17+
} else if (cmd === 'build') {
18+
webpack(prodConfig, (err, stats) => {
19+
console.log(stats.toString({
20+
chunks: false,
21+
color: true,
22+
children: false
23+
}));
24+
});
25+
}
26+
}

lib/server.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
'use strict';
2+
3+
const express = require('express');
4+
const webpack = require('webpack');
5+
const webpackDevMiddleware = require('webpack-dev-middleware');
6+
const app = express();
7+
8+
module.exports = (devConfig) => {
9+
const compiler = webpack(devConfig);
10+
11+
// Tell express to use the webpack-dev-middleware and use the webpack.config.js
12+
// configuration file as a base.
13+
app.use(webpackDevMiddleware(compiler, {
14+
publicPath: devConfig.output.publicPath
15+
}));
16+
17+
// Serve the files on port.
18+
app.listen(devConfig.devServer.port, function () {
19+
console.log(`Webpack server listening on port devConfig.devServer.port!\n`);
20+
});
21+
};

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"name": "builder-webpack",
3-
"version": "0.1.5",
2+
"name": "builder-webpack3",
3+
"version": "0.2.0-beta.1",
44
"description": "webpack项目构建器.",
55
"main": "lib/index.js",
66
"scripts": {
@@ -18,8 +18,10 @@
1818
"feflow"
1919
],
2020
"dependencies": {
21+
"autoprefixer-loader": "^3.2.0",
2122
"caniuse-db": "^1.0.30000764",
2223
"clean-webpack-plugin": "^0.1.17",
24+
"express": "^4.16.2",
2325
"extract-text-webpack-plugin": "^3.0.2",
2426
"file-loader": "^1.1.5",
2527
"glob": "^7.1.2",
@@ -32,7 +34,6 @@
3234
"raw-loader": "^0.5.1",
3335
"sass-loader": "^6.0.6",
3436
"style-loader": "^0.19.0",
35-
"autoprefixer-loader": "^3.2.0",
3637
"uglify-js": "^2.8.29",
3738
"webpack": "^3.8.1",
3839
"zip-webpack-plugin": "^2.1.0"

0 commit comments

Comments
 (0)