Skip to content

Commit b22ee53

Browse files
committed
1 parent b489abe commit b22ee53

6 files changed

Lines changed: 68 additions & 51 deletions

File tree

lib/builder.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ exports.getDllWebpackConfig = (config, option = {}) => {
9797
const cdn = config.cdn;
9898
const compile = config.compile || {};
9999
const host = config.host;
100+
const module = config.module;
100101
const configLoaders = config.loaders || {};
101102
const configPlugins = config.plugins || {};
102103
const optimization = config.optimization;
@@ -130,6 +131,7 @@ exports.getDllWebpackConfig = (config, option = {}) => {
130131
resolveLoader,
131132
install,
132133
cdn,
134+
module,
133135
loaders,
134136
plugins,
135137
optimization

lib/core/config.js

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,14 @@ class Config {
6666
}
6767

6868
get typescript() {
69-
const configLoaders = this.config.loaders;
70-
if (this.utils.isObject(configLoaders)) {
71-
if (configLoaders.typescript) {
72-
return true;
73-
}
74-
} else if (Array.isArray(configLoaders)) {
75-
return configLoaders.some(loader => {
76-
return !!loader.typescript;
77-
});
69+
if (this._typescript) {
70+
return this._typescript;
71+
}
72+
const typescript = this.getLoaderByName('typescript');
73+
if (this.utils.isObject(typescript) && this.utils.isTrue(typescript.enable)) {
74+
this._typescript = typescript;
7875
}
79-
return false;
76+
return this._typescript;
8077
}
8178

8279
get postcss() {

lib/core/constant.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
'use strict';
2+
module.exports = {
3+
STYLE_LOADER: 'style-loader'
4+
};

lib/core/loader.js

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
const path = require('path');
33
const fs = require('fs');
44
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
5+
const { STYLE_LOADER } = require('../core/constant');
56

67
module.exports = {
78

@@ -16,9 +17,10 @@ module.exports = {
1617
if (loaders[name]) {
1718
return loaders[name];
1819
}
20+
const mappingName = this.loaderKeyLabelMapping[name];
1921
return rules.find(loader => {
2022
const label = this.utils.getLoaderLabel(loader);
21-
if (name === label) {
23+
if (name === label || mappingName === label) {
2224
return true;
2325
}
2426
return false;
@@ -44,7 +46,7 @@ module.exports = {
4446
},
4547

4648
createBabelLoader(babel = {}) {
47-
babel = this.merge({ loader: 'babel-loader', options: {}}, babel);
49+
babel = this.merge({ loader: 'babel-loader', options: {} }, babel);
4850
const babelEnv = process.env.BABEL_ENV;
4951
if (babelEnv) {
5052
if (this.isBabel7) { // @babel/core use envName key
@@ -229,6 +231,55 @@ module.exports = {
229231
return webpackLoaders;
230232
},
231233

234+
235+
createFrameworkLoader(styleLoader = 'style-loader', options) {
236+
const preLoaders = {};
237+
const loaders = { js: this.createBabelLoader() }; // fix vue entry babel compile
238+
const extract = this.isUse('extract');
239+
Object.keys(this.loaders).forEach(name => {
240+
const itemLoader = this.loaders[name];
241+
if (itemLoader.framework && (itemLoader.enable || itemLoader.enable === undefined)) {
242+
const useLoaders = this.utils.cloneDeep(itemLoader).use;
243+
if (name !== 'css') {
244+
const preLoader = useLoaders[useLoaders.length - 1]; // get last loader
245+
if (this.utils.isString(preLoader)) {
246+
preLoaders[name] = preLoader;
247+
} else if (this.utils.isObject(preLoader) && preLoader.options) {
248+
preLoaders[name] = `${preLoader.loader}?${JSON.stringify(preLoader.options)}`;
249+
} else {
250+
preLoaders[name] = preLoader.loader;
251+
}
252+
}
253+
if (extract) {
254+
useLoaders.forEach(item => {
255+
if (item.loader === STYLE_LOADER) {
256+
item.loader = styleLoader;
257+
}
258+
});
259+
loaders[name] = useLoaders;
260+
} else {
261+
const filterLoaders = useLoaders.filter(item => {
262+
return item.loader !== STYLE_LOADER && item.loader !== styleLoader;
263+
});
264+
filterLoaders.unshift({ loader: styleLoader, options });
265+
loaders[name] = filterLoaders;
266+
}
267+
}
268+
});
269+
// https://github.com/TypeStrong/ts-loader/pull/782
270+
// vue-loader 14 版本中,需在 options 重复配置 ts-loader,升级 15 以后可移除
271+
if (this.typescript && !loaders.ts) {
272+
const use = this.utils.isFunction(this.typescript.use) ? this.typescript.use.apply(this) : this.typescript.use;
273+
const tsLoader = use.find(item => {
274+
return item.loader === 'ts-loader';
275+
});
276+
if (tsLoader) {
277+
loaders.ts = tsLoader;
278+
}
279+
}
280+
return { preLoaders, loaders };
281+
},
282+
232283
installLoader(loaders) {
233284
const dependencies = this.dependencies;
234285
const webpackLoaders = this.createLoader(loaders);

lib/target/base.js

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
'use strict';
2-
const STYLE_LOADER = 'style-loader';
32
const path = require('path');
43
const fs = require('fs');
54
const assert = require('assert');
65
const AssetFileWebpackPlugin = require('webpack-asset-file-plugin');
76
const Config = require('../core/config');
7+
const { STYLE_LOADER } = require('../core/constant');
88
class WebpackBaseBuilder extends Config {
99
constructor(config = {}) {
1010
super(config);
@@ -44,43 +44,6 @@ class WebpackBaseBuilder extends Config {
4444
return this.webpackOptimize.getCommonsChunk();
4545
}
4646

47-
createFrameworkLoader(styleLoader = 'style-loader', options) {
48-
const preLoaders = {};
49-
const loaders = { js: this.createBabelLoader() }; // fix vue entry babel compile
50-
const extract = this.isUse('extract');
51-
Object.keys(this.loaders).forEach(name => {
52-
const itemLoader = this.loaders[name];
53-
if (itemLoader.framework && (itemLoader.enable || itemLoader.enable === undefined)) {
54-
const useLoaders = this.utils.cloneDeep(itemLoader).use;
55-
if (name !== 'css') {
56-
const preLoader = useLoaders[useLoaders.length - 1]; // get last loader
57-
if (this.utils.isString(preLoader)) {
58-
preLoaders[name] = preLoader;
59-
} else if (this.utils.isObject(preLoader) && preLoader.options) {
60-
preLoaders[name] = `${preLoader.loader}?${JSON.stringify(preLoader.options)}`;
61-
} else {
62-
preLoaders[name] = preLoader.loader;
63-
}
64-
}
65-
if (extract) {
66-
useLoaders.forEach(item => {
67-
if (item.loader === STYLE_LOADER) {
68-
item.loader = styleLoader;
69-
}
70-
});
71-
loaders[name] = useLoaders;
72-
} else {
73-
const filterLoaders = useLoaders.filter(item => {
74-
return item.loader !== STYLE_LOADER && item.loader !== styleLoader;
75-
});
76-
filterLoaders.unshift({ loader: styleLoader, options });
77-
loaders[name] = filterLoaders;
78-
}
79-
}
80-
});
81-
return { preLoaders, loaders };
82-
}
83-
8447
prepareEntry(entries, entryLoader = {}) {
8548
if (this.entryLoader) {
8649
const mergeLoader = this.merge(entryLoader, this.entryLoader);

test/client.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ describe('client.test.js', () => {
5656
use: ['vue-html-loader']
5757
}
5858
};
59-
const builder = createBuilder({});
59+
const builder = createBuilder({ loaders: { typescript: true }});
6060
builder.mergeLoader(vueLoaderConfig);
6161
const webpackConfig = builder.create();
6262
const rules = webpackConfig.module.rules;

0 commit comments

Comments
 (0)