UNPKG

7.27 kBJavaScriptView Raw
1
2const NanachiWebpackPlugin = require('../nanachi-loader/plugin');
3const SizePlugin = require('../nanachi-loader/sizePlugin');
4const QuickPlugin = require('../nanachi-loader/quickPlugin');
5const ChaikaPlugin = require('../nanachi-loader/chaika-plugin/chaikaPlugin');
6const CopyWebpackPlugin = require('copy-webpack-plugin');
7const path = require('path');
8
9const utils = require('../packages/utils/index');
10const { intermediateDirectoryName } = require('./h5/configurations');
11//各种loader
12//生成文件
13const fileLoader = require.resolve('../nanachi-loader/loaders/fileLoader');
14//处理@component, @comom
15const aliasLoader = require.resolve('../nanachi-loader/loaders/aliasLoader');
16//visitor
17const nanachiLoader = require.resolve('../nanachi-loader/loaders/nanachiLoader');
18//将第三方依赖库复制到npm目录中
19const nodeLoader = require.resolve('../nanachi-loader/loaders/nodeLoader');
20//处理华为快应用
21const reactLoader = require.resolve('../nanachi-loader/loaders/reactLoader');
22
23//处理 style
24const nanachiStyleLoader = require.resolve('../nanachi-loader/loaders/nanachiStyleLoader');
25
26const cwd = process.cwd();
27
28module.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 //loader是从后往前处理
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, // 不允许使用注释配置eslint规则
100 useEslintrc: false // 不使用用户自定义eslintrc配置
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 // quickConfig可能不存在 需要try catch
129 try {
130 // quickConfig可能不存在 需要try catch
131 // chaika里,各种XConfig.json会合并到.CACHE/nanachi/source中
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 // eslint-disable-next-line
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 // performance: {
194 // hints: 'warning',
195 // assetFilter(filename) {
196 // return !/React\w+\.js/.test(filename);
197 // },
198 // maxAssetSize
199 // }
200 };
201};