节点JS fs模块在浏览器中

时间:2014-11-19 14:23:13

标签: javascript node.js module requirejs browserify

我有一个场景,我想从客户端将数据导出到CSV。我将有一个文本框/区域或用户可以输入数据的任何地方,然后理想情况下只需点击一下,就会使用该数据更新本地CSV文件。

这可以通过NodeJS与服务器交互及其核心模块(特别是fs模块)轻松实现,但显然不是来自浏览器。

我发现某些节点模块(例如underscore)支持RequireJS使特定模块在浏览器中工作的方法。所以对于下划线,我这样做了:

methods.js

define(['underscore'],function(_) {

    var Methods = {
        doSomething: function() {

            var x = _.size({one: 1, two: 2, three: 3, xuz: 3});

            alert(x);
        }
    };

    return Methods;
});

common.js

requirejs.config({
    baseURL: 'node_modules',
    paths: {
        underscore: 'underscore/underscore',
    }
});

require(['methods'], function(y){
    y.doSomething();
});

的index.html

<script data-main="common" src="require.js"></script>
<script>
require(['common'], function() {

    require(['methods.js']);
});
</script>

以上工作正常并会显示警告:4。

但是当我对fs模块尝试相同时,它将无法工作。它会显示此错误:

Module name "util" has not been loaded yet for context: _. Use require([])

据我所知,这是因为fs需要其他几个模块,其中一个模块是util

所以我继续将所有这些模块添加到RequireJS配置中。但仍然没有运气,所以我专门测试了util模块,因为这似乎不需要其他模块工作。

现在我遇到了这个错误:Uncaught ReferenceError: exports is not defined

我尝试通过将整个模块源代码封装在此模块化这个util模块:

define([], function() {})

但它也没有用......我也试过复制underscore的模型,但仍然没有运气。

所以我想知道是否有人设法使用util&amp;浏览器中的fs个模块(或任何其他核心NodeJS模块),包含RequireJS或Browserify等库。

2 个答案:

答案 0 :(得分:5)

没错,exports是特定于节点的JS(用于使模块的一部分在模块外部可用),并且不受Web浏览器的支持。尽管NodeJS在技术上是JS,但是有一些客户端特定的属性(如浏览器的window属性和NodeJS应用程序的exports)无法互换。

那就是说,here's客户端JS回答了CSV问题。

答案 1 :(得分:1)

您最好的选择(可能只有一个)是使用HTML5 FileSystem API。我不知道任何其他浏览器功能允许使用客户端计算机上的文件,除了Flash和类似的解决方案。

我对您的browserify标签感到有点困惑,因为您显然没有使用Browserify。这样可以解决“导出未定义”的问题。