1 |
|
2 | const NanachiWebpackPlugin = require('../nanachi-loader/plugin');
|
3 | const SizePlugin = require('../nanachi-loader/sizePlugin');
|
4 | const QuickPlugin = require('../nanachi-loader/quickPlugin');
|
5 | const ChaikaPlugin = require('../nanachi-loader/chaika-plugin/chaikaPlugin');
|
6 | const CopyWebpackPlugin = require('copy-webpack-plugin');
|
7 | const path = require('path');
|
8 |
|
9 | const utils = require('../packages/utils/index');
|
10 | const { intermediateDirectoryName } = require('./h5/configurations');
|
11 |
|
12 |
|
13 | const fileLoader = require.resolve('../nanachi-loader/loaders/fileLoader');
|
14 |
|
15 | const aliasLoader = require.resolve('../nanachi-loader/loaders/aliasLoader');
|
16 |
|
17 | const nanachiLoader = require.resolve('../nanachi-loader/loaders/nanachiLoader');
|
18 |
|
19 | const nodeLoader = require.resolve('../nanachi-loader/loaders/nodeLoader');
|
20 |
|
21 | const reactLoader = require.resolve('../nanachi-loader/loaders/reactLoader');
|
22 |
|
23 |
|
24 | const nanachiStyleLoader = require.resolve('../nanachi-loader/loaders/nanachiStyleLoader');
|
25 |
|
26 | const cwd = process.cwd();
|
27 |
|
28 | module.exports = function({
|
29 | platform,
|
30 | compress,
|
31 | compressOption,
|
32 | plugins,
|
33 | rules,
|
34 | huawei,
|
35 | analysis,
|
36 | prevLoaders, // 自定义预处理loaders
|
37 | postLoaders, // 自定义后处理loaders
|
38 | // maxAssetSize // 资源大小限制,超出后报warning
|
39 | }) {
|
40 |
|
41 | let aliasMap = require('../packages/utils/calculateAliasConfig')();
|
42 | let distPath = path.resolve(cwd, utils.getDistName(platform));
|
43 | if (platform === 'h5') {
|
44 | distPath = path.join(distPath, intermediateDirectoryName);
|
45 | }
|
46 | let copyPluginOption = null;
|
47 | if (compress) {
|
48 | const compressImage = require(path.resolve(cwd, 'node_modules', 'nanachi-compress-loader/utils/compressImage.js'));
|
49 | copyPluginOption = {
|
50 | transform(content, path) {
|
51 | const type = path.replace(/.*\.(.*)$/, '$1');
|
52 | return compressImage(content, type, compressOption);
|
53 | },
|
54 | cache: true,
|
55 | };
|
56 | }
|
57 |
|
58 | const nodeRules = [{
|
59 | test: /node_modules[\\/](?!schnee-ui[\\/])/,
|
60 | use: [].concat(
|
61 | fileLoader,
|
62 | postLoaders,
|
63 | aliasLoader,
|
64 | nodeLoader)
|
65 | }];
|
66 | const copyAssetsRules = [{
|
67 | from: '**',
|
68 | to: 'assets',
|
69 | context: 'source/assets',
|
70 | ignore: [
|
71 | '**/*.@(js|jsx|json|sass|scss|less|css)'
|
72 | ],
|
73 | ...copyPluginOption
|
74 | }];
|
75 | const mergePlugins = [].concat(
|
76 | new ChaikaPlugin(),
|
77 | analysis ? new SizePlugin() : [],
|
78 | new NanachiWebpackPlugin({
|
79 | platform,
|
80 | compress
|
81 | }),
|
82 | new CopyWebpackPlugin(copyAssetsRules),
|
83 | plugins);
|
84 |
|
85 | const mergeRule = [].concat(
|
86 | {
|
87 | test: /\.jsx?$/,
|
88 |
|
89 | use: [].concat(
|
90 | fileLoader,
|
91 | postLoaders,
|
92 | platform !== 'h5' ? aliasLoader: [],
|
93 | nanachiLoader,
|
94 | {
|
95 | loader: require.resolve('eslint-loader'),
|
96 | options: {
|
97 | configFile: require.resolve(`./eslint/.eslintrc-${platform}.js`),
|
98 | failOnError: utils.isMportalEnv(),
|
99 | allowInlineConfig: false,
|
100 | useEslintrc: false
|
101 | }
|
102 | },
|
103 | prevLoaders ) ,
|
104 | exclude: /node_modules[\\/](?!schnee-ui[\\/])|React/,
|
105 | },
|
106 | platform !== 'h5' ? nodeRules : [],
|
107 | {
|
108 | test: /React\w+/,
|
109 | use: [].concat(
|
110 | fileLoader,
|
111 | postLoaders,
|
112 | nodeLoader,
|
113 | reactLoader),
|
114 | },
|
115 | {
|
116 | test: /\.(s[ca]ss|less|css)$/,
|
117 | use: [].concat(
|
118 | fileLoader,
|
119 | postLoaders,
|
120 | platform !== 'h5' ? aliasLoader : [],
|
121 | nanachiStyleLoader,
|
122 | prevLoaders)
|
123 | },
|
124 | rules);
|
125 |
|
126 | if (platform === 'quick') {
|
127 | mergePlugins.push(new QuickPlugin());
|
128 |
|
129 | try {
|
130 |
|
131 |
|
132 | var quickConfig = {};
|
133 | process.env.NANACHI_CHAIK_MODE === 'CHAIK_MODE'
|
134 | ? quickConfig = require(path.join(cwd, '.CACHE/nanachi/source', 'quickConfig.json'))
|
135 | : quickConfig = require(path.join(cwd, 'source', 'quickConfig.json'));
|
136 | if (huawei) {
|
137 | if (quickConfig && quickConfig.widgets) {
|
138 | quickConfig.widgets.forEach(widget => {
|
139 | const widgetPath = widget.path;
|
140 | if (widgetPath) {
|
141 | const rule = {
|
142 | from: '**',
|
143 | to: widgetPath.replace(/^[\\/]/, ''),
|
144 | context: path.join('source', widgetPath),
|
145 | ...copyPluginOption
|
146 | };
|
147 | copyAssetsRules.push(rule);
|
148 | }
|
149 | });
|
150 | }
|
151 | } else if (quickConfig && quickConfig.router && quickConfig.router.widgets) {
|
152 |
|
153 | Object.keys(quickConfig.router.widgets).forEach(key => {
|
154 | const widgetPath = quickConfig.router.widgets[key].path;
|
155 | if (widgetPath) {
|
156 | const rule = {
|
157 | from: '**',
|
158 | to: widgetPath.replace(/^[\\/]/, ''),
|
159 | context: path.join('source', widgetPath),
|
160 | ...copyPluginOption
|
161 | };
|
162 | copyAssetsRules.push(rule);
|
163 | }
|
164 | });
|
165 | }
|
166 | } catch (err) {
|
167 |
|
168 | }
|
169 | }
|
170 | const entry = process.env.NANACHI_CHAIK_MODE === 'CHAIK_MODE'
|
171 | ? path.join(cwd, '.CACHE/nanachi/source/app')
|
172 | : path.join(cwd, 'source/app');
|
173 | return {
|
174 | entry: entry,
|
175 | mode: 'development',
|
176 | output: {
|
177 | path: distPath,
|
178 | filename: 'index.bundle.js'
|
179 | },
|
180 | module: {
|
181 | rules: mergeRule
|
182 | },
|
183 | plugins: mergePlugins,
|
184 | resolve: {
|
185 | alias: aliasMap,
|
186 | mainFields: ['main'],
|
187 | symlinks: true,
|
188 | modules: [
|
189 | path.join(process.cwd(), 'node_modules')
|
190 | ]
|
191 | },
|
192 | externals: platform === 'h5' ? ['react','@react','react-dom', 'react-loadable', '@qunar-default-loading', '@dynamic-page-loader', /^@internalComponents/] : []
|
193 |
|
194 |
|
195 |
|
196 |
|
197 |
|
198 |
|
199 |
|
200 | };
|
201 | };
|