我正在开发一个移动网站(它不是单页应用程序),它的 JS 占用空间非常小(压缩和压缩后不到 10KB)。没有库或外部依赖项,所有代码都是内部编写的 vanilla javascript。它在逻辑上被分成几个文件,在部署之前连接起来,以减少 HTTP 请求的数量。文件中没有明确的命名空间。也就是说,它们看起来像:
// crossbrowser.js
function getScrollOffset() {
// implementation
}
function ...
这不太理想,没有明确的依赖关系解析,并且范围很容易从函数内部受到污染。没有进行任何处理来检查这一点(lint 或编译器)。作为第一步,我认为实现显式模块系统可以防止这种情况并让代码更好。
阅读 CommonJS 模块格式和 RequireJS、Lab.js 等加载器,据我了解,在浏览器端使用模块时,他们都希望通过 XHR 加载它们。我不希望这样,我想保留包含所有模块的单一脚本格式。我的文件看起来像:
var define = function () { /* ... */ };
var require = function () { /* ... */ };
define("crossbrowser", function (require, exports, module) {
exports.getScrollOffset = function() {
//
};
// etc.
});
define("foo", function (require, exports, module) {
var crossbrowser = require('crossbrowser');
exports.getNewOffset = function () {
var offset = crossbrowser.getScrollOffset();
// do something
return offset;
}
});
window.addEventListener('DOMContentLoaded', function () {
// really dumb example, but I hope it gets the point across
var crossbrowser = require('crossbrowser'),
foo = require('foo');
crossbrowser.scrollTo(foo.getNewOffset());
});
问题是是否有任何加载器以这种方式工作,还是我必须编写自己的define
and实现require
?