我最终通过自己的调用从服务器端获取了文件。
在节点中(但这也可以用 PHP 或任何其他语言完成),我添加了一个检索请求文件的路由:
router.get('/loadFile/', function(req, res, next){
var params = req.query;
var demo = express.static(path.join(res.locals.virtualDirPath, 'public'));
fs.readFile( __dirname + '/../public/elements/' + params.filename, "utf-8", function read(err, data) {
if (err) {
throw err;
}
// Invoke the next step here however you like
return res.send(data);
processFile();
});
});
然后我在 Javascript 端创建了我自己的自定义组件加载器,详见文档。
var templateFromUrlLoader = {
loadTemplate: function(name, templateConfig, callback) {
var newUrl = url + 'others/loadFile/';
var params = { 'filename' : templateConfig.filename };
if (templateConfig.filename) {
// Uses jQuery's ajax facility to load the markup from a file
$.get(newUrl, params, function(markupString) {
// We need an array of DOM nodes, not a string.
// We can use the default loader to convert to the
// required format.
ko.components.defaultLoader.loadTemplate(name, markupString, callback);
});
} else {
// Unrecognized config format. Let another loader handle it.
callback(null);
}
}
};
// Registering it
ko.components.loaders.unshift(templateFromUrlLoader);
这样我就不必为这个简单的任务加载 84Kb 的 require.js。另外,我不限于使用 require.js,我可以将单个组合和缩小文件用于生产环境。
此外,我完全控制了返回模板的缓存,这在使用 require.js 时曾经给我带来问题。