使用 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.html
和 js/main.js
中的代码工作完美,我已经测试过了。
两个有趣的文件(ui/widget.html
和settings.json
分别包含完美的HTML和JSON)。
在 js/main.js
中,我想同时加载 ui/widget.html
和 settings.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")
应该可以解决问题。
我使用 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.html
和 js/main.js
中的代码工作完美,我已经测试过了。
两个有趣的文件(ui/widget.html
和settings.json
分别包含完美的HTML和JSON)。
在 js/main.js
中,我想同时加载 ui/widget.html
和 settings.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")
应该可以解决问题。