Skip to content

4 修正界面空白

msojocs edited this page May 2, 2022 · 3 revisions

前言

通过控制台报错解决一些明显问题

修正

node

查看控制台可看到类似如下的错误:

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 复制进去; 打开,查看控制台,没有这个报错了。

spdlog模块

查看控制台,可以看到 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 目录下可以发现 spdlogspdlog-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

  1. node-gyp 构建

    在临时文件夹中安装 spdlog 模块,得到 node-gyp 构建的 spdlog.node 文件;将其复制到 package.nw/node_modules/spdlog-node/build/Release

    注:安装的版本要与 package.nw/node_modules 中的一致

  2. 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

重新打开项目,没有该提示了

watchdog模块

经过以上操作,编辑器能够使用了;

查看控制台发现一个与 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)

使用的类似的方式处理