yarn add -D babel-plugin-preprocessor
or
npm install -D babel-plugin-preprocessor
interface PluginOptions {
symbols: Record<string, any>;
directives: Record<string, boolean>;
}
在 babel
配置文件中设置插件选项:
{
"plugins": [
...
["preprocessor", {
"symbols": { "IS_BROWSER": true },
"directives": { "DEBUG": true }
}]
]
}
使用 #if
/ #else
/ #elseif
(alias: #elif
) / #endif
等内置指令前, 你需要先配置 symbols 选项
// #if IS_BROWSER
console.log('This is browser');
// #else
console.log('It\\'s unknown');
// #endif
如果 IS_BROWSER
是真的, console.log ('It\\'s unknown');
将被删除,反之亦然
像变量一样去使用 symbols 的参数:
{
"plugins": [
["preprocessor", { "symbols": { "IE": 8, "UA": "Chrome" } }]
]
}
// #if (IE > 8 && IE < 12) || UA.startsWith('Chrome')
console.log('Support HTML5');
// #else
console.log('HTML5 is not supported'); // This line will be deleted
// #endif
通过配置 directives 选项实现自定义指令:
// #debug
console.log('debug message');
如果 debug
是假的, console.log
将被删除掉
Note 自定义指令只影响其下一行,这意味着:
// #debug
console.log('debug message'); // 这一行将被删除
const a = ''; // 这一行将被保留
这个插件的灵感来源于 webpack-preprocessor-loader, 因此, 你可以放心的使用它的内置指令:
// #!if IS_BROWSER
console.log('This is browser');
// #!else
console.log('It\\'s unknown');
// #!endifWW
如果你使用了它的 #!debug
指令, 请配置 directives 选项,如果你还使用了它的 verbose
选项, 你需要根据使用情况配置 symbols 选项。
为了抑制错误,最简单的方式是在所有声明前使用 // @ts-ignore
// #if ENV = 'develop'
// @ts-ignore
const foo = 1;
// #else
// @ts-ignore
const foo = -1;
// #endif
从 0.0.2
版本开始,就完全支持JSX指令:
import React from 'react';
import ErrorBoundary from './boundary';
export default () => {
return (
/* #if IS_BROWSER */
<ErrorBoundary fallback={() => <div>Fallback</div>}>
{/* #endif */}
<div>
{/* #debug */}
<span>This line should be deleted</span>
Do something
</div>
{/* #if IS_BROWSER */}
</ErrorBoundary>
/* #endif */
);
}
如果一个 JSX
元素具有关闭标签,那么,可以省略关闭标签的指令:
import React from 'react';
import ErrorBoundary from './boundary';
export default () => {
return (
/* #if IS_BROWSER */
<ErrorBoundary fallback={() => <div>Fallback</div>}>
{/* #endif */}
<div>
{/* #debug */}
<span>This line should be deleted</span>
Do something
</div>
</ErrorBoundary>
);
}
但是, 我建议你保留它,以兼容 webpack-preprocessor-loader
使用 JSX
时要还要注意元素的包装,否则会出现一些意想不到的结果:
import React from 'react';
import ErrorBoundary from './boundary';
export default () => {
return (
/* #if IS_BROWSER */
<ErrorBoundary fallback={() => <div>Fallback</div>}>
{/* #endif */}
{/* #debug */}
<span>This line should be deleted</span>
Do something
{/* #if IS_BROWSER */}
</ErrorBoundary>
/* #endif */
);
}
如果 IS_BROWSER
为 false 且 debug
为 true, 那么 Do something
行会被丢掉