1/* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16const path = require('path'); 17const fs = require('fs'); 18const webpack = require('webpack'); 19const TerserPlugin = require('terser-webpack-plugin'); 20const SnapshotPlugin = require('./lib/lite/lite-snapshot-plugin'); 21const ImageCoverterPlugin = require('./lib/lite/lite-image-coverter-plugin'); 22const ReturnExportsPlugin = require('./lib/lite/lite-return-exports-plugin'); 23const ResourcePlugin = require('./lib/resource-plugin'); 24const ResultStates = require('./lib/compile-plugin'); 25const { checkFilePath } = require('./lib/lite/lite-customize'); 26const CopyPlugin = require("copy-webpack-plugin"); 27 28process.env.DEVICE_LEVEL = 'lite'; 29process.env.DEVICE_TYPE = 'smartVision'; 30 31const watchMode = (process.env.watchMode && process.env.watchMode === 'true') || false; 32const pictrueSwitch = process.env.img2bin !== 'false'; 33const util = require('./lib/util'); 34const { PLATFORM }= require('./lib/lite/lite-enum'); 35const { deleteFolderRecursive, readManifest, loadEntryObj, checkMultiResourceBuild } = require('./main.product'); 36 37const webpackConfig = { 38 target: ['web', 'es5'], 39 cache: { 40 type: 'filesystem' 41 }, 42 watch: watchMode, 43 watchOptions: { 44 aggregateTimeout: 10, 45 poll: false, 46 ignored: /node_modules/, 47 }, 48 optimization: { 49 moduleIds: 'deterministic', 50 chunkIds: 'deterministic', 51 }, 52 output: { 53 filename: '[name].js', 54 pathinfo: false, 55 devtoolModuleFilenameTemplate: (info) => { 56 return `${info.absoluteResourcePath.replace(process.env.projectRootPath + path.sep, '')}`; 57 }, 58 }, 59 devtool: 'nosources-source-map', 60 mode: 'development', 61 module: { 62 rules: [ 63 { 64 test: /(\.hml|app\.js)(\?[^?]+)?$/, 65 use: [{ 66 loader: path.resolve(__dirname, './index.js') 67 }] 68 }, 69 { 70 test: /\.png$/, 71 use: [{ 72 loader: 'file-loader', 73 options: { 74 name: '[name].[ext]', outputPath: 'common' 75 } 76 }] 77 }, 78 { 79 test: /\.css$/, 80 use: [{ 81 loader: 'css-loader' 82 }] 83 }, 84 { 85 test: /\.less$/, 86 use: [{ 87 loader: 'less-loader' 88 }] 89 }, 90 { 91 test: /\.(scss|sass)$/, 92 use: [{ 93 loader: 'style-loader!css-loader!sass-loader' 94 }] 95 }, 96 { 97 test: /\.jsx?$/, 98 use: [ 99 { 100 loader: path.resolve(__dirname, 'lib/module-script.js'), 101 }, 102 { 103 loader: util.loadBabelModule('babel-loader'), 104 options: { 105 presets: [util.loadBabelModule('@babel/preset-env')], 106 plugins: [util.loadBabelModule('@babel/plugin-transform-modules-commonjs'), 107 util.loadBabelModule('@babel/plugin-proposal-class-properties')], 108 }, 109 }, 110 ] 111 } 112 ] 113 }, 114 node: { 115 global: false, 116 }, 117 stats: 'none', 118}; 119 120function existsPackageJson(config, rootPackageJsonPath, modulePackageJsonPath) { 121 if (config.cache) { 122 config.cache.buildDependencies = { 123 config: [] 124 }; 125 if (fs.existsSync(rootPackageJsonPath)) { 126 config.cache.buildDependencies.config.push(rootPackageJsonPath); 127 } 128 if (fs.existsSync(modulePackageJsonPath)) { 129 config.cache.buildDependencies.config.push(modulePackageJsonPath); 130 } 131 } 132} 133 134function setConfigs(env) { 135 process.env.error = env.error === undefined ? true : env.error 136 process.env.warning = env.warning === undefined ? true : env.warning 137 process.env.note = env.note === undefined ? true : env.note 138 process.env.buildMode = env.buildMode || 'debug' 139 process.env.logLevel = env.logLevel || '1' 140 process.env.projectPath = env.aceModuleRoot || process.env.aceModuleRoot || process.cwd(); 141 process.env.buildPath = env.aceModuleBuild || process.env.aceModuleBuild || path.resolve(process.env.projectPath, 'build'); 142 process.env.cachePath = env.cachePath || process.env.cachePath || path.resolve(__dirname, 'node_modules/.cache'); 143 process.env.aceManifestPath = process.env.aceManifestPath || path.resolve(process.env.projectPath, 'manifest.json'); 144 process.env.watchCSSFiles = process.env.watchCSSFiles || path.resolve(process.env.cachePath, '.lite_cache', 'preview_css.json'); 145 process.env.abilityType = 'page'; 146 const manifest = readManifest(process.env.aceManifestPath) 147 process.env.PLATFORM_VERSION = PLATFORM.VERSION6; 148 const version = parseInt(manifest.minPlatformVersion); 149 if (version == 5) { 150 process.env.PLATFORM_VERSION = PLATFORM.VERSION5; 151 } 152 if (version <= 4) { 153 process.env.PLATFORM_VERSION = PLATFORM.VERSION3; 154 } 155 process.env.PLATFORM_VERSION_VERSION = version; 156 process.env.aceBuildJson = env.aceBuildJson || process.env.aceBuildJson; 157 checkMultiResourceBuild(process.env.aceBuildJson); 158} 159 160module.exports = (env) => { 161 setConfigs(env) 162 deleteFolderRecursive(process.env.buildPath); 163 existsPackageJson(webpackConfig, path.resolve(process.env.projectPath, '../../../../../oh-package.json5'), 164 path.resolve(process.env.projectPath, '../../../../oh-package.json5')); 165 webpackConfig.cache.cacheDirectory = path.resolve(process.env.cachePath, '.lite_cache'); 166 webpackConfig.entry = loadEntryObj(process.env.projectPath, process.env.DEVICE_LEVEL, 167 process.env.abilityType, process.env.aceManifestPath) 168 webpackConfig.output.path = path.resolve(__dirname, process.env.buildPath) 169 webpackConfig.plugins = [ 170 new ResourcePlugin(process.env.projectPath, process.env.buildPath, 171 process.env.aceManifestPath, process.env.watchCSSFiles), 172 new ResultStates({ 173 build: process.env.buildPath 174 }), 175 new ReturnExportsPlugin(), 176 new webpack.DefinePlugin({ 177 STANDARD: JSON.stringify(false), 178 LITE: JSON.stringify(true) 179 }) 180 ] 181 webpackConfig.resolve = { 182 modules: [ 183 process.env.projectPath, 184 path.join(process.env.projectPath, '../../../../../'), 185 path.join(__dirname, 'node_modules'), 186 './node_modules', 187 './oh_modules' 188 ] 189 } 190 if (fs.existsSync(path.resolve(process.env.projectPath, 'i18n'))) { 191 webpackConfig.plugins.push(new CopyPlugin({ 192 patterns: [ 193 { 194 from: path.resolve(process.env.projectPath, 'i18n'), 195 to: path.resolve(process.env.buildPath, 'i18n'), 196 noErrorOnMissing: true 197 } 198 ] 199 })) 200 } 201 202 if (process.env.hapMode && process.env.hapMode === 'true') { 203 webpackConfig.optimization = { 204 minimize: true, 205 minimizer: [new TerserPlugin({ 206 terserOptions: { 207 compress: false, 208 mangle: true, 209 }, 210 }, 211 )], 212 }; 213 } 214 215 if (pictrueSwitch) { 216 webpackConfig.plugins.push( 217 new ImageCoverterPlugin({ build: process.env.buildPath }), 218 ); 219 } 220 221 if (env.deviceType) { 222 const deviceArr = env.deviceType.split(/,/); 223 if (deviceArr.includes('liteWearable')) { 224 process.env.DEVICE_TYPE = 'liteWearable'; 225 } 226 } 227 228 if (env.sourceMap === 'none') { 229 webpackConfig.devtool = false 230 } 231 if (env.buildMode === 'release') { 232 webpackConfig.devtool = 'source-map' 233 webpackConfig.mode = 'production'; 234 webpackConfig.plugins.push( 235 new SnapshotPlugin({ build: process.env.buildPath }) 236 ); 237 webpackConfig.output.sourceMapFilename = '_releaseMap/[name].js.map' 238 } 239 checkFilePath(); 240 return webpackConfig; 241}; 242