决定将我的所有Javascript库实现为与node.js兼容的模块之后,我现在已经将一个简单的“需求”组合在一起了。在客户端使用的功能。我确实已经意识到已经有很多非常好的实现了,但是大多数看起来相当笨重,所以我只是选择使用"滚动你自己的"做法。
这是我的'require.js'文件:
/*
A client-side script loading class designed to be compatible with node.js
*/
function require(filename)
{
try
{
var
script = null,
ajax = new XMLHttpRequest(),
index = filename.toLowerCase().indexOf('.js');
if(index <= 0 || index != filename.length - 3)
filename += '.js';
ajax.onload = function()
{
script = this.responseText;
};
ajax.open('GET', filename, false);
ajax.send();
return _isolate_script_(script);
}
catch(error)
{
return null;
}
}
function _isolate_script_(_script_)
{
return (new Function
(
'var exports = {}, module = {exports : null}; '
+ _script_ +
'; return module.exports || exports;'
)).call();
}
示例模块(&#39; example.js&#39;):
/*
Example of a multiple-class export file
*/
exports.metallic = function(value)
{
return (Math.sqrt(4 + value * value) + value) / 2;
}
exports.inverse_metallic = function(value)
{
return exports.metallic(-value);
}
模块消费者的例子(&#39; main.js&#39;):
function main()
{
var
example = require('example');
if(example != null)
{
var
value = Math.floor(Math.random() * 100) + 1;
alert
(
'example.metallic(' + value + ') = ' + example.metallic(value)
+ '\n' +
'example.inverse_metallic(' + value + ') = ' + example.inverse_metallic(value)
);
}
else
alert('Error: cannot load "example"');
}
最后,一个调用我们的页面逻辑的基本HTML文件:
<!DOCTYPE html>
<html>
<head>
<script src = 'require.js'></script>
<script src = 'main.js'></script>
</head>
<body onload = "main()"></body>
</html>
所以我的具体问题是我是否已经正确地实现了所有内容,而且如果框架和用例似乎足够犹豫了?
答案 0 :(得分:3)
您似乎正在尝试重新实现Browserify:
浏览器没有定义require方法,但Node.js确实如此。使用Browserify,您可以编写使用require的代码,方法与在Node中使用它的方式相同。
如果您想自己实现类似的东西,请查看Browserify源代码。
答案 1 :(得分:0)
我自己就是要回答这个问题。
主要问题是旧浏览器有时会冻结同步ajax请求。简单地在它自己的线程中启动整个“main”函数似乎是一个很好的解决方案。也就是说,如果加载脚本出现一些无法预料的问题,那么页面本身可能没有响应,但浏览器至少应该不受影响。换句话说,就像这样:
<!DOCTYPE html>
<html>
<head>
<script src = 'require.js'></script>
<script src = 'main.js'></script>
</head>
<body onload = "setInterval(main)"></body>
</html>
至于对吞吐量的担忧,我现在用大量数据(~100 MB)对此进行了测试,并且对于代码是使用脚本标记还是通过ajax调用加载而言,性能似乎没什么差别。两个不同操作系统上的所有主流浏览器和结果几乎相同。因此,除非我看到相反的令人信服的证据,否则我只是假设这是规则而不是例外。
所有这一切,我当然对任何可能的评论或批评持开放态度。