因为@define
在模块中不起作用,所以我写了一个可以在编译之前运行的补丁。它去:
import { c } from '@artdeco/erte'
import { readFileSync, writeFileSync } from 'fs'
import { join } from 'path'
const [,,version] = process.argv
const PATH = join(__dirname, 'index.js')
let f = readFileSync(PATH, 'utf-8')
const isFree = version == '--free'
if (isFree) {
f = f.replace("\nimport isFree from './paid'", "\n// import isFree from './paid'")
f = f.replace("\n// import isFree from './free'", "\nimport isFree from './free'")
console.log('Set version to %s', c('free', 'red'))
} else {
f = f.replace("\n// import isFree from './paid'", "\nimport isFree from './paid'")
f = f.replace("\nimport isFree from './free'", "\n// import isFree from './free'")
console.log('Set version to %s', c('paid', 'magenta'))
}
writeFileSync(PATH, f)
用法: node ./src/version/patch --free node ./src/version/patch --paid
./src/version/index.js
正在修补的实际情况:
// import isFree from './free'
import isFree from './paid'
使用“./free”:
export default true
使用“./paid”:
export default true
基于此,您可以从以下位置导出变量index.js
:
export const free = isFree
所以这是为了允许编译付费和免费包,但您可以扩展此代码以调整调试/生产版本。
尽管如此,这应该通过-D
(@define) 来完成,但显然对于像谷歌这样的万亿美元公司来说,这非常困难。