实施客户端'要求'功能与node.js兼容

时间:2017-03-24 14:45:07

标签: javascript node.js node-modules

决定将我的所有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>

所以我的具体问题是我是否已经正确地实现了所有内容,而且如果框架和用例似乎足够犹豫了?

2 个答案:

答案 0 :(得分:3)

您似乎正在尝试重新实现Browserify

  

浏览器没有定义require方法,但Node.js确实如此。使用Browserify,您可以编写使用require的代码,方法与在Node中使用它的方式相同。

如果您想自己实现类似的东西,请查看Browserify源代码。

请参阅:https://github.com/substack/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调用加载而言,性能似乎没什么差别。两个不同操作系统上的所有主流浏览器和结果几乎相同。因此,除非我看到相反的令人信服的证据,否则我只是假设这是规则而不是例外。

所有这一切,我当然对任何可能的评论或批评持开放态度。