内联常量
有时,在输出的 JavaScript 中,你可能想要将特定的值强制内联。例如:
JSif (process.env.mode === 'development') {
console.log("Dev-only code here!")
}
原因是你的 JavaScript 打包器(例如 Webpack)可能会将它们转换为:
JSif ('production' === 'development') {
console.log("Dev-only code here!")
}
之后的 Uglifyjs 优化过程会将整个 if
块移除。这样开发模式代码可以带有大量开发警告,同时确保压缩(精简)后的生产代码能去除掉这些昂贵的代码,ReactJS 等项目就是这样做的。
因此,在 ReScript 中,生成类似 if (process.env.mode === 'development')
的输出是很重要的。以下的尝试没有效果:
JS 输出显示 if (process.env.mode === mode)
,这不是我们想要的结果。需要使用 @inline
来内联 mode
的值:
现在生成的 JS 代码可以像其他的 JS 代码一样通过 Webpack 和 Uglifyjs,并且整个 console.log
可以被移除。
目前,内联只对 string,float 和 boolean 有效。
技巧和诀窍
这不是一个优化。这是一个边缘情况特性,提供给需要为 JavaScript 后处理步骤(例如条件编译)内联特定值的人们。除了条件编译输出的代码可能有所不同之外,内联和不内联简单值对于 JavaScript 引擎来说没有性能上的差异。