UNPKG

5.84 kBJavaScriptView Raw
1"use strict"; /**
2 * Created by wuwei on 2017/6/14.
3 */
4let path = require('path');
5let fs = require('fs');
6const webpack = require("webpack");
7let cwd = process.cwd();
8let env = require("./utils/env");
9let _ = require('shelljs');
10const colors = require('colors');
11const { validate, config } = require('./options');
12const handleServer = require('./webpack/server/handleServer');
13// @ts-ignore
14global.__tua = {}; // 缓存过程中用到的变量
15const core = require('./core');
16const pageList = require('./listpage');
17
18let chmod777 = function () {
19 if (process.platform !== "win32" && typeof process.getuid === 'function' && process.getuid() === 0) {//当前是管理员用户
20 _.chmod("-R", 777, path.resolve(cwd, './' + config.dist));
21 if (fs.existsSync(path.resolve(cwd, './.cache-loader'))) {
22 _.chmod("-R", 777, path.resolve(cwd, './.cache-loader'));
23 }
24 if (fs.existsSync(path.resolve(cwd, './node_modules/.cache/cache-loader'))) {
25 _.chmod("-R", 777, path.resolve(cwd, './node_modules/.cache/cache-loader'));
26 }
27 }
28};
29
30module.exports = {
31 /**
32 * 生成dll文件
33 * @param stat DEBUG, PUBLISH 等模式
34 * @param suc 成功生成文件后的回调
35 * @param fail 生成失败后的回调
36 */
37 dll: function (stat, suc, fail) {
38 core.initGenerate();
39 validate();
40 env.setEnv(stat.toUpperCase());
41 let { chainWebpack } = require('./webpack/config.dll');
42 let dllEntry = Object.keys(config.dll ? config.dll.chunks || {} : {});
43 if (dllEntry.length === 0) {
44 suc();
45 return;
46 }
47 webpack(chainWebpack(), (err, stats) => {
48 try {
49 if (err || stats.hasErrors()) {
50 // 处理失败
51 if (typeof fail === 'function') {
52 fail(stats);
53 console.error(colors.red(stats.compilation.errors)); //更加详细的错误信息
54 }
55 } else {
56 //处理成功
57 if (typeof suc === 'function') {
58 suc(stats);
59 }
60 }
61 chmod777();
62 } catch (err) {
63 console.error(colors.red(err.stack)); //更加详细的错误信息
64 }
65 });
66 },
67 /**
68 * 启动服务器,可同时供服务端和客户端同时使用
69 * @param params 参数,可用于过滤入口
70 * @param callback 启动服务器成功后的回调
71 * @param serverType 启动服务器类型,默认express
72 */
73 start: async function (params, callback, serverType) {
74 core.initGenerate();
75 validate();
76 env.setEnv("DEBUG");
77 core.onBeforeCompile();
78 let babelConf = require('./webpack/client/config'); //此引用只能在setEnv后使用,其中依赖setEnv后的变量
79 const webpackDevServer = require("./utils/startWebpackDevServer")(babelConf, serverType);
80 let firstClientCompile = true;
81 let firstServerCompile = true;
82
83 let clientOk = new Promise((resolve, reject) => {
84 webpackDevServer.compiler.hooks.done.tap('tuaClientCompile', stats => {
85 let clientStats = stats;
86 if (clientStats.hasErrors()) {
87 global['clientCompileStats'] = clientStats; //更加详细的错误信息
88 }
89 if (firstClientCompile) {
90 firstClientCompile = false;
91 } else {
92 global['clientUpdated'] = true;
93 pageList.show(babelConf, webpackDevServer, serverType);
94 }
95 resolve();
96 });
97 });
98
99 let serverOk = new Promise((resolve, reject) => {
100 try {
101 handleServer('debug', serverType, function (err, stats) {
102 if (typeof callback === 'function') {
103 callback(stats);
104 }
105 if (firstServerCompile) {
106 firstServerCompile = false;
107 } else {
108 pageList.show(babelConf, webpackDevServer, serverType);
109 }
110 resolve();
111 }, webpackDevServer, clientOk);
112 } catch (err) {
113 console.error(colors.red(err.stack)); //更加详细的错误信息
114 }
115 });
116
117 if (handleServer.noSsr()) {
118 await Promise.all([clientOk]);
119 } else {
120 await Promise.all([clientOk, serverOk]);
121 }
122
123 pageList.show(babelConf, webpackDevServer, serverType);
124
125 chmod777();
126 },
127 /**
128 * 发布 客户端代码和服务端代码
129 * @param stat publish toserver 两种
130 * @param params 参数,可用于过滤入口
131 * @param suc 成功回调
132 * @param fail 失败回调
133 * @param ssuc 服务端成功回调
134 * @param sfail 服务端失败回调
135 */
136 pack: function (stat, params, suc, fail, ssuc, sfail) {
137 core.initGenerate();
138 validate();
139 env.setEnv(stat || "PUBLISH");
140 core.onBeforeCompile();
141 let publishconf = require('./webpack/client/config');
142 webpack(publishconf, (err, stats) => {
143 try {
144 if (err || stats.hasErrors()) {
145 if (typeof fail === 'function') {
146 fail(stats);
147 console.error(colors.red(stats.compilation.errors)); //更加详细的错误信息
148 }
149 } else {
150 // 处理完成
151 if (typeof suc === 'function') {
152 suc(stats);
153 }
154 }
155 chmod777();
156 // @ts-ignore
157 handleServer(stat, undefined, function (err, stats) {
158 if (err || stats.hasErrors()) {
159 if (typeof sfail === 'function') {
160 sfail(stats);
161 console.error(colors.red(stats.compilation.errors)); //更加详细的错误信息
162 }
163 } else {
164 // 处理完成
165 if (typeof ssuc === 'function') {
166 ssuc(stats);
167 }
168 }
169 chmod777();
170 });
171 } catch (err) {
172 console.error(colors.red(err.stack)); //更加详细的错误信息
173 }
174 });
175 } };
\No newline at end of file