问题描述
对于我正在设计的小型无状态API,我需要一个非常简单的i18n工具。我将只用两种语言管理少于30个字符串,不会更多。
我决定编写一个非常简单的i18n工具:
exports.i18nString = function (language,stringID) {
try {
var dictionary = require(`./${language}.json`)
if (Array.isArray(dictionary[stringID])) {
return dictionary[stringID][Math.floor(Math.random() * dictionary[stringID].length)];
}
return dictionary[stringID];
} catch(error) {
}
return "";
}
JSON字典示例:
{
"example": "This is an example","multi": [
"Choice 1","Choice 2","Choice 3"
]
}
它运行完美,非常符合我的需求。不过,有一件事让我感到困扰:每次调用的函数中都存在require
,需要一个字符串。
我是Js的初学者,但我知道require
会打开文件,读取文件内容并进行评估。但是我不知道Js是否足够聪明,可以将文件的内容保留在缓存中以供后续调用。如果是这样,那么我的代码就可以了。如果不是这样,我可能会遇到性能问题。
你们能启发我吗?
解决方法
我在随机搜索时找到了答案。
这就是问题:Node.js 确实缓存每个文件,如here所述:
模块在第一次加载后被缓存。这意味着(除其他事项外)如果对require('foo')
的每次调用都解析为相同的文件,则将获得完全相同的返回对象。
如果未修改require.cache
,则对require('foo')
的多次调用不会导致模块代码被多次执行。