在浏览器中使用Node JS的fs模块

19

我有一个场景,想要从客户端将数据导出为CSV格式。我会有一个文本框/区域或其他地方,用户可以输入数据,然后理想情况下,点击一次按钮时,本地的CSV文件将被更新为该数据。

使用Node.js和其核心模块(特别是fs模块),通过与服务器交互很容易实现此目标。但显然从浏览器中实现这一点就不那么容易。

我发现某些Node.js模块(例如underscore)支持RequireJS的方法,在浏览器中使用特定的模块。因此我对underscore进行了以下操作:

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();
});

首页.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的模型,但仍然没有运气。

所以我想知道是否有人成功地在浏览器中使用了utilfs模块(或任何其他核心的NodeJS模块),并结合RequireJS或Browserify等库。

2个回答

11

没错,exports 是 NodeJS 中的 JS(用于在模块之外提供部分模块功能),并且不受 Web 浏览器支持。尽管 NodeJS 技术上是 JS,但是存在特定于客户端的属性(例如浏览器中的 window 属性和 NodeJS 应用程序中的 exports),不能互换使用。

话虽如此,这里提供了一个客户端 JS 方案来解决 CSV 问题。


1
我收到的两个答案都是正确的,经过更多的研究后我也发现了这一点。但是针对我的具体情况(为了让用户远离数据库并且可能在客户端进行操作),我最终采用了两个 NodeJS 服务器(一个用于读取,另一个用于写入)。它们监听 CSV 文件的更改,并通过 NodeJS fs 模块从文件系统中进行读取/写入。这种方法不完全是客户端操作,但您可以避免与数据库的交互和维护,而且所有内容都是使用 JS 从客户端到服务器端实现的。 - magicode118

2
你最好的选择(也可能是唯一的选择)是使用HTML5 FileSystem API。我不知道除了Flash和类似的解决方案之外,是否有其他浏览器功能可以在客户端计算机上处理文件。
我对你的Browserify标签有点困惑,因为你显然没有使用Browserify。使用Browserify可以解决“exports未定义”的问题。

还可以使用filer在浏览器中模拟fs,它使用IndexedDB来模拟文件系统。 - Anderson Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接