UNPKG

5.98 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未生成的时候发生的,直接打印出来
50 console.error(colors.red(err));
51 }
52 if (err || stats.hasErrors()) {
53 // 处理失败
54 if (typeof fail === 'function') {
55 fail(stats);
56 console.error(colors.red(stats.compilation.errors)); //更加详细的错误信息
57 }
58 } else {
59 //处理成功
60 if (typeof suc === 'function') {
61 suc(stats);
62 }
63 }
64 chmod777();
65 } catch (err) {
66 console.error(colors.red(err.stack)); //更加详细的错误信息
67 }
68 });
69 },
70 /**
71 * 启动服务器,可同时供服务端和客户端同时使用
72 * @param params 参数,可用于过滤入口
73 * @param callback 启动服务器成功后的回调
74 * @param serverType 启动服务器类型,默认express
75 */
76 start: async function (params, callback, serverType) {
77 core.initGenerate();
78 validate();
79 env.setEnv("DEBUG");
80 core.onBeforeCompile();
81 let babelConf = require('./webpack/client/config'); //此引用只能在setEnv后使用,其中依赖setEnv后的变量
82 const webpackDevServer = require("./utils/startWebpackDevServer")(babelConf, serverType);
83 let firstClientCompile = true;
84 let firstServerCompile = true;
85
86 let clientOk = new Promise((resolve, reject) => {
87 webpackDevServer.compiler.hooks.done.tap('tuaClientCompile', stats => {
88 let clientStats = stats;
89 if (clientStats.hasErrors()) {
90 global['clientCompileStats'] = clientStats; //更加详细的错误信息
91 }
92 if (firstClientCompile) {
93 firstClientCompile = false;
94 } else {
95 global['clientUpdated'] = true;
96 pageList.show(babelConf, webpackDevServer, serverType);
97 }
98 resolve();
99 });
100 });
101
102 let serverOk = new Promise((resolve, reject) => {
103 try {
104 handleServer('debug', serverType, function (err, stats) {
105 if (typeof callback === 'function') {
106 callback(stats);
107 }
108 if (firstServerCompile) {
109 firstServerCompile = false;
110 } else {
111 pageList.show(babelConf, webpackDevServer, serverType);
112 }
113 resolve();
114 }, webpackDevServer, clientOk);
115 } catch (err) {
116 console.error(colors.red(err.stack)); //更加详细的错误信息
117 }
118 });
119
120 if (handleServer.noSsr()) {
121 await Promise.all([clientOk]);
122 } else {
123 await Promise.all([clientOk, serverOk]);
124 }
125
126 pageList.show(babelConf, webpackDevServer, serverType);
127
128 chmod777();
129 },
130 /**
131 * 发布 客户端代码和服务端代码
132 * @param stat publish toserver 两种
133 * @param params 参数,可用于过滤入口
134 * @param suc 成功回调
135 * @param fail 失败回调
136 * @param ssuc 服务端成功回调
137 * @param sfail 服务端失败回调
138 */
139 pack: function (stat, params, suc, fail, ssuc, sfail) {
140 core.initGenerate();
141 validate();
142 env.setEnv(stat || "PUBLISH");
143 core.onBeforeCompile();
144 let publishconf = require('./webpack/client/config');
145 webpack(publishconf, (err, stats) => {
146 try {
147 if (err || stats.hasErrors()) {
148 if (typeof fail === 'function') {
149 fail(stats);
150 console.error(colors.red(stats.compilation.errors)); //更加详细的错误信息
151 }
152 } else {
153 // 处理完成
154 if (typeof suc === 'function') {
155 suc(stats);
156 }
157 }
158 chmod777();
159 // @ts-ignore
160 handleServer(stat, undefined, function (err, stats) {
161 if (err || stats.hasErrors()) {
162 if (typeof sfail === 'function') {
163 sfail(stats);
164 console.error(colors.red(stats.compilation.errors)); //更加详细的错误信息
165 }
166 } else {
167 // 处理完成
168 if (typeof ssuc === 'function') {
169 ssuc(stats);
170 }
171 }
172 chmod777();
173 });
174 } catch (err) {
175 console.error(colors.red(err.stack)); //更加详细的错误信息
176 }
177 });
178 } };
\No newline at end of file