1 |
|
2 |
|
3 |
|
4 |
|
5 | const path = require('path')
|
6 | const fs = require('fs')
|
7 | const yargs = require('yargs')
|
8 | const fsExtra = require('fs-extra')
|
9 |
|
10 | const webpack = require('webpack')
|
11 |
|
12 | const {colorconsole} = require('./packager/lib/utils')
|
13 | const info = require('./packager/lib/info')
|
14 |
|
15 | global.colorconsole = colorconsole
|
16 |
|
17 |
|
18 | const options = Object.assign({}, yargs.argv)
|
19 |
|
20 |
|
21 | const FILE_EXT_LIST = info.name.extList
|
22 |
|
23 | const FILE_EXT_NORES = FILE_EXT_LIST.concat(['.js', '.jsx', '.coffee', '.ts', '.tsx', '.vue', '.css', '.less', '.sass', '.styl', '.html', '.json', '.md'])
|
24 |
|
25 |
|
26 | const pathProject = process.cwd()
|
27 |
|
28 | const pathSrc = path.join(pathProject, 'src')
|
29 |
|
30 | const nameBuild = 'build'
|
31 |
|
32 | const pathBuild = path.join(pathProject, nameBuild)
|
33 |
|
34 | const pathDist = path.join(pathProject, 'dist')
|
35 |
|
36 | const nameManifest = 'manifest.json'
|
37 | const pathManifest = path.join(pathSrc, nameManifest)
|
38 |
|
39 |
|
40 | const nameEntry = 'game.js'
|
41 | const pathEntry = path.join(pathSrc, nameEntry)
|
42 |
|
43 |
|
44 | const pathDirname = __dirname
|
45 |
|
46 |
|
47 | !validateProject()
|
48 |
|
49 |
|
50 | const appPackageName = getProjectName()
|
51 |
|
52 |
|
53 | const zipReses = {}
|
54 |
|
55 |
|
56 | extractSourceFiles('.', false)
|
57 |
|
58 |
|
59 | const nodeConf = parseEnv()
|
60 |
|
61 | const webpackConf = {
|
62 | entry: {
|
63 | game: pathEntry
|
64 | },
|
65 | output: {
|
66 | path: pathBuild,
|
67 | filename: '[name].js'
|
68 | },
|
69 | module: {
|
70 | rules: []
|
71 | },
|
72 | plugins: [
|
73 |
|
74 | new webpack.DefinePlugin({
|
75 |
|
76 | ENV_PLATFORM: JSON.stringify(nodeConf.NODE_PLATFORM),
|
77 |
|
78 | ENV_PHASE: JSON.stringify(nodeConf.NODE_PHASE),
|
79 | ENV_PHASE_DV: nodeConf.NODE_PHASE === 'dv',
|
80 | ENV_PHASE_QA: nodeConf.NODE_PHASE === 'qa',
|
81 | ENV_PHASE_OL: nodeConf.NODE_PHASE === 'ol'
|
82 | }),
|
83 |
|
84 | function () {
|
85 | this.plugin('run', function (compiler, callback) {
|
86 | process.webpackDateS = new Date()
|
87 | callback()
|
88 | })
|
89 | this.plugin('watch-run', function (compiler, callback) {
|
90 | process.webpackDateS = new Date()
|
91 | callback()
|
92 | })
|
93 | this.plugin('done', function () {
|
94 | process.webpackDateE = new Date()
|
95 | const secCost = (process.webpackDateE - process.webpackDateS) / 1000
|
96 | colorconsole.info(`Build Time Cost: ${secCost}s`)
|
97 | })
|
98 | }
|
99 | ],
|
100 | node: {
|
101 | global: false
|
102 | },
|
103 | resolve: {
|
104 | modules: [
|
105 | 'node_modules',
|
106 |
|
107 | path.join(pathProject, 'test')
|
108 | ],
|
109 | extensions: ['.webpack.js', '.web.js', '.js', '.json'].concat(FILE_EXT_LIST)
|
110 | },
|
111 | stats: {
|
112 | children: false,
|
113 | chunks: false,
|
114 | chunkModules: false,
|
115 | chunkOrigins: false,
|
116 | modules: false,
|
117 | version: false,
|
118 | assets: false
|
119 | }
|
120 | }
|
121 |
|
122 |
|
123 | if (nodeConf.NODE_PHASE === 'dv') {
|
124 |
|
125 | webpackConf.devtool = 'source-map'
|
126 | }
|
127 | else {
|
128 |
|
129 | webpackConf.plugins.push(new webpack.optimize.DedupePlugin())
|
130 | webpackConf.plugins.push(new webpack.optimize.UglifyJsPlugin())
|
131 | }
|
132 |
|
133 |
|
134 | loadWebpackConfList()
|
135 |
|
136 | module.exports = webpackConf
|
137 |
|
138 |
|
139 |
|
140 |
|
141 | function loadWebpackConfList () {
|
142 | const moduleList = findModuleList(pathDirname)
|
143 |
|
144 |
|
145 |
|
146 | moduleList.push({ name: '', path: path.join(pathProject, 'config') })
|
147 |
|
148 | for (let i = 0, len = moduleList.length; i < len; i++) {
|
149 | const moduleItem = moduleList[i]
|
150 | const fileConf = path.join(moduleItem.path, 'webpack.config.js')
|
151 | if (fs.existsSync(fileConf)) {
|
152 | try {
|
153 | const moduleWebpackConf = require(fileConf)
|
154 | if (moduleWebpackConf.postHook) {
|
155 | moduleWebpackConf.postHook(webpackConf, {
|
156 | appPackageName,
|
157 | nodeConf,
|
158 | pathDist,
|
159 | pathDirname,
|
160 | zipReses,
|
161 | pathBuild
|
162 | }, options)
|
163 | }
|
164 | }
|
165 | catch (err) {
|
166 | console.error(`加载webpack配置文件[${fileConf}]出错:${err.message}`)
|
167 | }
|
168 | }
|
169 | }
|
170 | }
|
171 |
|
172 |
|
173 |
|
174 |
|
175 |
|
176 |
|
177 | function findModuleList (parentDir) {
|
178 | const moduleList = []
|
179 | const fileNameList = fs.readdirSync(pathDirname)
|
180 | for (let i = 0, len = fileNameList.length; i < len; i++) {
|
181 | const fileName = fileNameList[i]
|
182 | const filePath = path.join(parentDir, fileName)
|
183 | const fileStat = fs.statSync(filePath)
|
184 | if (fileStat.isDirectory()) {
|
185 | moduleList.push({
|
186 | name: fileName,
|
187 | path: filePath
|
188 | })
|
189 | }
|
190 | }
|
191 | return moduleList
|
192 | }
|
193 |
|
194 |
|
195 |
|
196 |
|
197 | function parseEnv(){
|
198 | const config = {
|
199 |
|
200 | NODE_PLATFORM: process.env.NODE_PLATFORM,
|
201 |
|
202 | NODE_PHASE: process.env.NODE_PHASE,
|
203 |
|
204 | NODE_TEST: process.env.NODE_TEST
|
205 | }
|
206 | colorconsole.info(`配置环境:${JSON.stringify(config)}`)
|
207 | return config
|
208 | }
|
209 |
|
210 |
|
211 |
|
212 |
|
213 | function validateProject () {
|
214 | if (!fs.existsSync(pathManifest)) {
|
215 | colorconsole.throw(`请确认项目%projectDir%/src/下存在manifest.json文件:${pathManifest}`)
|
216 | }
|
217 |
|
218 | if (!fs.existsSync(pathEntry)) {
|
219 | colorconsole.throw(`请确认项目%projectDir%/src/下存在game.js文件:${pathEntry}`)
|
220 | }
|
221 |
|
222 |
|
223 | fsExtra.emptyDirSync(pathBuild)
|
224 |
|
225 | if (fs.existsSync(pathDist)) {
|
226 | const zipfiles = fs.readdirSync(pathDist)
|
227 | zipfiles.forEach(function (file) {
|
228 | const curPath = pathDist + '/' + file
|
229 | if (fs.statSync(curPath).isFile()) {
|
230 | fs.unlinkSync(curPath)
|
231 | }
|
232 | })
|
233 | }
|
234 | return true
|
235 | }
|
236 |
|
237 |
|
238 |
|
239 |
|
240 |
|
241 | function getProjectName() {
|
242 | const config = JSON.parse(fs.readFileSync(pathManifest))
|
243 | return (config && config.package) || 'Bundle'
|
244 | }
|
245 |
|
246 |
|
247 |
|
248 |
|
249 |
|
250 |
|
251 | function extractSourceFiles(dir, common) {
|
252 | dir = dir || '.'
|
253 | var directory = path.join(pathSrc, dir)
|
254 | var name
|
255 |
|
256 | fs.readdirSync(directory)
|
257 | .forEach(function (file) {
|
258 | var fullpath = path.join(directory, file)
|
259 | var stat = fs.statSync(fullpath)
|
260 | var basename = path.basename(fullpath)
|
261 | var extname = path.extname(fullpath)
|
262 | if (stat.isFile() ) {
|
263 | if(basename === nameManifest || FILE_EXT_NORES.indexOf(extname) < 0 ) {
|
264 |
|
265 | name = path.join(nameBuild, dir, path.basename(file))
|
266 | name = name.replace(/\\/g, '/')
|
267 | zipReses[name] = fullpath
|
268 | }
|
269 | }
|
270 | else if (stat.isDirectory()) {
|
271 | var subdir = path.join(dir, file)
|
272 | var iscommon = common || (file.toLowerCase() === 'common')
|
273 | extractSourceFiles(subdir, iscommon)
|
274 | }
|
275 | })
|
276 | }
|