文档 / 语言手册 / 内联常量
Edit

内联常量

有时,在输出的 JavaScript 中,你可能想要将特定的值强制内联。例如:

JS
if (process.env.mode === 'development') { console.log("Dev-only code here!") }

原因是你的 JavaScript 打包器(例如 Webpack)可能会将它们转换为:

JS
if ('production' === 'development') { console.log("Dev-only code here!") }

之后的 Uglifyjs 优化过程会将整个 if 块移除。这样开发模式代码可以带有大量开发警告,同时确保压缩(精简)后的生产代码能去除掉这些昂贵的代码,ReactJS 等项目就是这样做的。

因此,在 ReScript 中,生成类似 if (process.env.mode === 'development') 的输出是很重要的。以下的尝试没有效果:

ReScriptJS Output
@val external process: 'a = "process"

let mode = "development"

if (process["env"]["mode"] === mode) {
  Js.log("Dev-only code here!")
}

JS 输出显示 if (process.env.mode === mode),这不是我们想要的结果。需要使用 @inline 来内联 mode 的值:

ReScriptJS Output
@val external process: 'a = "process"

@inline
let mode = "development"

if (process["env"]["mode"] === mode) {
  Js.log("Dev-only code here!")
}

现在生成的 JS 代码可以像其他的 JS 代码一样通过 Webpack 和 Uglifyjs,并且整个 console.log可以被移除。

目前,内联只对 string,float 和 boolean 有效。

技巧和诀窍

不是一个优化。这是一个边缘情况特性,提供给需要为 JavaScript 后处理步骤(例如条件编译)内联特定值的人们。除了条件编译输出的代码可能有所不同之外,内联和不内联简单值对于 JavaScript 引擎来说没有性能上的差异。