私は自分の呼び出しでサーバー側からファイルを取得することになりました。
ノードで (ただし、これは 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();
});
});
次に、 docs で詳しく説明されているように、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 の使用時に問題を引き起こしていた、返されたテンプレートのキャッシュを完全に制御できます。