• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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