Skip to content

Commit b0b3694

Browse files
committed
feat: export createCSSRule in chainWebpack for implementing sass, stylus, ...
1 parent 68506de commit b0b3694

7 files changed

Lines changed: 42 additions & 8 deletions

File tree

docs/config/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ Umi 内置了以下别名:
9191

9292
```js
9393
export default {
94-
chainWebpack(memo, { env, webpack }) {
94+
chainWebpack(memo, { env, webpack, createCSSRule }) {
9595
// 设置 alias
9696
memo.resolve.alias.set('foo', '/tmp/a/b/foo');
9797

@@ -108,6 +108,7 @@ export default {
108108
* memo,当前 webpack-chain对象
109109
* env,当前环境,`development``production``test`
110110
* webpack,webpack 实例,用于获取其内部插件
111+
* createCSSRule,用于扩展其他 CSS 实现,比如 sass, stylus
111112

112113
## chunks
113114

docs/config/README.zh-CN.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ Umi 内置了以下别名:
8989

9090
```js
9191
export default {
92-
chainWebpack(memo, { env, webpack }) {
92+
chainWebpack(memo, { env, webpack, createCSSRule }) {
9393
// 设置 alias
9494
memo.resolve.alias.set('foo', '/tmp/a/b/foo');
9595

@@ -106,6 +106,7 @@ export default {
106106
* memo,当前 webpack-chain对象
107107
* env,当前环境,`development``production``test`
108108
* webpack,webpack 实例,用于获取其内部插件
109+
* createCSSRule,用于扩展其他 CSS 实现,比如 sass, stylus
109110

110111
## chunks
111112

docs/plugins/api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ api.addHTMLScript(() => {
262262
比如:
263263

264264
```js
265-
api.chainWebpack((config, { webpack }) => {
265+
api.chainWebpack((config, { webpack, env, createCSSRule }) => {
266266
// Set alias
267267
config.resolve.alias.set('a', 'path/to/a');
268268

docs/plugins/api.zh-CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ api.addHTMLScript(() => {
262262
比如:
263263

264264
```js
265-
api.chainWebpack((config, { webpack }) => {
265+
api.chainWebpack((config, { webpack, env, createCSSRule }) => {
266266
// Set alias
267267
config.resolve.alias.set('a', 'path/to/a');
268268

packages/bundler-webpack/src/getConfig/css.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ interface ICreateCSSRuleOpts extends IOpts {
2121
options?: object;
2222
}
2323

24-
function createCSSRule({
24+
export function createCSSRule({
2525
webpackConfig,
2626
config,
2727
lang,

packages/bundler-webpack/src/getConfig/getConfig.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
getBabelPresetOpts,
1212
getTargetsAndBrowsersList,
1313
} from '@umijs/bundler-utils';
14-
import css from './css';
14+
import css, { createCSSRule } from './css';
1515
import terserOptions from './terserOptions';
1616
import { objToStringified } from './utils';
1717

@@ -391,16 +391,29 @@ export default async function getConfig(
391391
},
392392
);
393393

394+
function createCSSRuleFn(opts: any) {
395+
createCSSRule({
396+
webpackConfig,
397+
config,
398+
isDev,
399+
browserslist,
400+
miniCSSExtractPluginLoaderPath,
401+
...opts,
402+
});
403+
}
404+
394405
if (opts.chainWebpack) {
395406
webpackConfig = await opts.chainWebpack(webpackConfig, {
396407
webpack: bundleImplementor,
408+
createCSSRule: createCSSRuleFn,
397409
});
398410
}
399411
// 用户配置的 chainWebpack 优先级最高
400412
if (config.chainWebpack) {
401413
config.chainWebpack(webpackConfig, {
402414
env,
403415
webpack: bundleImplementor,
416+
createCSSRule: createCSSRuleFn,
404417
});
405418
}
406419
let ret = webpackConfig.toConfig() as defaultWebpack.Configuration;

packages/types/index.d.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ export interface ITargets {
6565
[key: string]: number | boolean;
6666
}
6767

68+
interface ICreateCSSRule {
69+
(opts: {
70+
lang: string;
71+
test: RegExp;
72+
loader?: string;
73+
options?: object;
74+
}): void;
75+
}
76+
6877
type IPresetOrPlugin = string | [string, any];
6978
type env = 'development' | 'production';
7079

@@ -155,7 +164,10 @@ export interface IApi extends PluginAPI {
155164
(string | { name: string; headScript?: boolean })[],
156165
{ route: IRoute }
157166
>;
158-
chainWebpack: IModify<WebpackChain, { webpack: typeof webpack }>;
167+
chainWebpack: IModify<
168+
WebpackChain,
169+
{ webpack: typeof webpack; createCSSRule: ICreateCSSRule }
170+
>;
159171

160172
// ApplyPluginType.add
161173
addHTMLHeadScripts: IAdd<{ route?: IRoute }, IScriptConfig>;
@@ -206,7 +218,14 @@ export interface IConfig extends IConfigCore {
206218
autoprefixer?: object;
207219
base?: string;
208220
chainWebpack?: {
209-
(memo: WebpackChain, args: { webpack: typeof webpack; env: env }): void;
221+
(
222+
memo: WebpackChain,
223+
args: {
224+
webpack: typeof webpack;
225+
env: env;
226+
createCSSRule: ICreateCSSRule;
227+
},
228+
): void;
210229
};
211230
chunks?: string[];
212231
cssLoader?: object;

0 commit comments

Comments
 (0)