使用 node-webkit 读取内部和外部文件

Read internal and external files with node-webkit

我使用 nw.js 并将以下文件压缩到 package.nw 文件中:

js/main.js
ui/widget.html
index.html
package.json

此外,我有一个随包一起提供的外部文件,所以我最后有这些文件:

package.nw
settings.json

package.json 配置为以 index.html 开头。在那里,我 link js/main.js 带有脚本标签:

<!-- inside index.html -->
<script src="js/main.js"></script>

index.htmljs/main.js 中的代码工作完美,我已经测试过了。

两个有趣的文件(ui/widget.htmlsettings.json分别包含完美的HTML和JSON)。

js/main.js 中,我想同时加载 ui/widget.htmlsettings.json。为此,我尝试过:

// inside js/main.js
var fs, w1, w2;

fs = require("fs");
w1 = fs.readFileSync("ui/widget.html");
w2 = require("ui/widget.html");

结果是:

w1: "" (empty string)

w2: ERROR (Unexpected token "<")

当我更改文件名时,我得到 w1 错误 ENOENT(没有这样的文件或目录)。所以我可以用正确的文件名告诉 w1 条目实际上是在包 中找到的(没有 ENOENT)但是内容不知何故没有加载到字符串。

w2 的错误可能是由隐式 JSON.parse()eval() 引起的,即 understandable/acceptable。与我预期的工作相比,这是一次绝望的尝试。

所以,我已经尝试了几个小时,但我无法读取该文件。

对于第二种情况(外部settings.json)我试过这个:

// inside js/main.js
var fs, s1, s2, s3;

fs = require("fs");
s1 = fs.readFileSync("settings.json");
s2 = require("settings.json");
s3 = require("settings");

对于 s1 我得到:

"" (empty string)

对于s2

Error: Cannot find module 'settings'

对于s3:

Error: Cannot find module 'settings.json'

看来我也无法打开该文件。我也尝试在启动前更改目录 nw,但无济于事。

我已经用尽了所有路径、选项、尝试和 manuals/tutorials/SO 问题。在这两种不同的情况下我做错了什么?


我重写了一个干净的测试用例,但问题完全一样。我在node_modules中省略了fs,用npm安装。

这是来自另一个具有相同问题的示例的来源。

package.json的内容:

{
  "name": "test",
  "main": "index.html",
  "window": {
    "toolbar": false,
    "width": 800,
    "height": 480
  }
}

index.html的内容:

<!DOCTYPE html>

<html>
  <head>
    <script src="main.js"></script>
  </head>
  <body>
  </body>
</html>

main.js的内容:

"use strict";

window.onload = function () {
  var fs, html;

  fs = require("fs");

  try {
    html = fs.readFileSync("./test.html");
    console.log(html);          // empty string
  } catch(ex) {
    console.log(ex.message);    // unreached
  }

  try {
    html = require("./test.html");
    console.log(html);          // unreached
  } catch(ex) {
    console.log(ex.message);    // error
  }
};

test.html的内容:

<div id="widget_message">
  @message
</div>

根据文档,当且仅当指定第二个参数 encoding 时,fs.readFileSync() returns a String。否则它 returns 一个缓冲区。

所以 fs.readFileSync("settings.json", "utf8") 应该可以解决问题。