-
Notifications
You must be signed in to change notification settings - Fork 66
4 修正界面空白
通过控制台报错解决一些明显问题
查看控制台可看到类似如下的错误:
Uncaught Error: spawn /mnt/disk2/wechat-devtools/wechat-devtools-for-wiki/nwjs0531/node ENOENT
at __node_internal_captureLargerStackTrace (node:internal/errors:456)
at __node_internal_errnoException (node:internal/errors:586)
at Process.ChildProcess._handle.onexit (node:internal/child_process:282)
at onErrorNT (node:internal/child_process:480)
at processTicksAndRejections (node:internal/process/task_queues:83)
at runNextTicks (node:internal/process/task_queues:65)
at processTimers (node:internal/timers:497)
检查 nwjs 目录,发现并不存在 node 文件,而 windows 版本下面有个 node.exe 文件,所以我们需要手动加一个;
那么要加什么版本的呢?
在控制台输入 process.versions
可得到如下结果:
{
"node":"16.1.0",
"v8":"9.0.257.23",
"uv":"1.41.0",
"zlib":"1.2.11",
"brotli":"1.0.9",
"ares":"1.17.1",
"modules":"93",
"nghttp2":"1.42.0",
"napi":"8",
"llhttp":"6.0.1",
"openssl":"1.1.1k+quic",
"icu":"68.1",
"unicode":"13.0",
"nw":"0.53.1",
"node-webkit":"0.53.1",
"nw-commit-id":"1313ab6-6749c6a-074b0bf-37966cd",
"nw-flavor":"sdk",
"chromium":"90.0.4430.93"
}
于是,我们将 node v16.1.0 复制进去; 打开,查看控制台,没有这个报错了。
查看控制台,可以看到 node 相关错误,带了一些乱码(星号)
node_modules/spdlog/build/Release/spdlog.node: ***ELF***
at Object.Module._extensions..node (node:internal/modules/cjs/loader:1213:18)
at Module.load (node:internal/modules/cjs/loader:1013:32)
at Function.Module._load (node:internal/modules/cjs/loader:853:14)
at Module.require (node:internal/modules/cjs/loader:1037:19)
这个需要将 node 模块在 Linux 平台重新编译一遍(逻辑不好理)
这个编译操作涉及到 node-gyp
以及 nw-gyp
模块分析
在 package.nw/node_modules
目录下可以发现 spdlog
与 spdlog-node
目录,需要辨别一下二者区别。
在 package.nw 目录下执行 grep -lr 'spdlog-node' .
搜索 spdlog-node , 得到:
./js/libs/vseditor/bundled/editor.bundled.js
./js/libs/vseditor/bundled/ext.bundled.js
可以看到相关代码 "object"==typeof nw?require("spdlog"):require("spdlog-node")
;
从上述代码可以知道,在 nw 有定义时加载 spdlog 模块(使用 nw-gyp
编译),未定义时加载 spdlog-node 模块(使用 node-gyp
编译)。
使用gyp处理spdlog
-
node-gyp 构建
在临时文件夹中安装 spdlog 模块,得到 node-gyp 构建的 spdlog.node 文件;将其复制到
package.nw/node_modules/spdlog-node/build/Release
注:安装的版本要与
package.nw/node_modules
中的一致 -
nw-gyp 构建
创建文件
test/fix-node_modules.sh
填入内容:#!/bin/bash root_dir=$(cd `dirname $0`/.. && pwd -P) export PATH="$root_dir/tmp:$root_dir/node1610:$PATH" mkdir -p $root_dir/tmp cd $root_dir/tmp && ln -s $(which python2) python cd $root_dir/tmp/node_modules/spdlog && nw-gyp rebuild --arch=x64 "--target=0.53.1" --dist-url=https://registry.npmmirror.com/-/binary/nwjs
将构建后的 spdlog.node 文件复制到
package.nw/node_modules/spdlog/build/Release
目录
OK, 经过以上操作,重新打开项目,界面不是完全空白了
弹出了一个类似于刚才 node 的提示,可以使用软链接对 node 进行链接一个新的 node.exe
在 nwjs 目录下执行 ln -s node node.exe
重新打开项目,没有该提示了
经过以上操作,编辑器能够使用了;
查看控制台发现一个与 spdlog 相似的错误:
watchdog.node: invalid ELF header
at Object.Module._extensions..node (node:internal/modules/cjs/loader:1168:18)
at Module.load (node:internal/modules/cjs/loader:989:32)
at Function.Module._load (node:internal/modules/cjs/loader:829:14)
使用的类似的方式处理