ruoyi-vue-ERR_SYSTEM_ERROR-uv_os_gethostname

ruoyi-vue: gitee
环境:
OS: WIN 7
node:  v18.20.4
npm: 10.7.0 



后端需要修改: mysql/redis配置
前端: 在ruoyi-ui目录下执行: npm run dev时报错了,
报错信息如下: 
SystemError [ERR_SYSTEM_ERROR]: A system error occurred: uv_os_gethostname returned ENOSYS (function not implemented)
    at new Defaults (E:\data\sts4-1\RuoYi-Vue\ruoyi-ui\node_modules\@achrinza\node-ipc\entities\Defaults.js:27:20)
    at new Parser (E:\data\sts4-1\RuoYi-Vue\ruoyi-ui\node_modules\@achrinza\node-ipc\entities\EventParser.js:8:14)
    at Object.<anonymous> (E:\data\sts4-1\RuoYi-Vue\ruoyi-ui\node_modules\@achrinza\node-ipc\dao\client.js:11:19)
    at Module._compile (node:internal/modules/cjs/loader:1364:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1422:10)
    at Module.load (node:internal/modules/cjs/loader:1203:32)
    at Module._load (node:internal/modules/cjs/loader:1019:12)
    at Module.require (node:internal/modules/cjs/loader:1231:19)
    at require (node:internal/modules/helpers:177:18)
    at Object.<anonymous> (E:\data\sts4-1\RuoYi-Vue\ruoyi-ui\node_modules\@achrinza\node-ipc\services\IPC.js:4:14) {
  code: 'ERR_SYSTEM_ERROR',
  info: {
    errno: -4054,
    code: 'ENOSYS',
    message: 'function not implemented',
    syscall: 'uv_os_gethostname'
  },
  errno: [Getter/Setter],
  syscall: [Getter/Setter]
}

Node.js v18.20.4

在stackoverflow找到了解决方法, 大概原因就是:  NodeJS 开发人员从版本 14 开始决定删除 GetHostNameW 函数(通过从 libuv v1.40 更新到 v1.41),并且在他们看来,为了删除一个函数,允许放弃对 Windows 7 的支持 .
解决办法就是:安装一个hostname-patcher,然后在报错的文件内引入即可. 
import 'hostname-patcher'; // import patch first import os from 'os'; // then os


安装: npm install hostname-patcher -S , 这样可以写入package.json文件内.


因为是在ruoyi-ui\node_modules\@achrinza\node-ipc\entities\Defaults.js内报错的,所以直接修改这个文件即可.
但当我直接将
import 'hostname-patcher'; // import patch first 
import os from 'os'; // then os
粘贴进去之后,  执行npm run dev时,又报错了: 
import 'hostname-patcher'
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at internalCompileFunction (node:internal/vm:76:18)
    at wrapSafe (node:internal/modules/cjs/loader:1283:20)
    at Module._compile (node:internal/modules/cjs/loader:1328:27)
    at Module._extensions..js (node:internal/modules/cjs/loader:1422:10)
    at Module.load (node:internal/modules/cjs/loader:1203:32)
    at Module._load (node:internal/modules/cjs/loader:1019:12)
    at Module.require (node:internal/modules/cjs/loader:1231:19)
    at require (node:internal/modules/helpers:177:18)
    at Object.<anonymous> (E:\data\sts4-1\RuoYi-Vue\ruoyi-ui\node_modules\@achrinza\node-ipc\services\IPC.js:3:18)
    at Module._compile (node:internal/modules/cjs/loader:1364:14)

Node.js v18.20.4


阅读了这个文章: Cannot use import statement outside a module 报错问题,才了解到import和require是有区别的,文章结尾总结如下: 
1. JavaScript 的两种模块:ES6 模块(ESM)和 CommonJS 模块(CJS)。
2. CommonJS 模块使用 require() 和 module.exportsES6 模块使用 import 和 export
3. ES6 模块与 CommonJS 模块的差异。
4. Node.js 的模块加载方法:
CommonJS 模块是 Node.js 专用。从 Node.js v13.2 版本开始,Node.js 默认打开了 ES6 模块支持。

文章中其他一些心得: 

报错原因是不能在模块外使用 import 语句。在 Node.js 环境中默认使用的是 CommonJS 规范。需要使用 require 语句进行导入import 是 ES6 中的模块化写法,CommonJS 模块与 ES6 模块不兼容。


① 在 package.json 中设置字段 “type”:“module”
② 使用 .mjs 的扩展名。(从 Node.js v13.2 版本开始,Node.js 已经默认打开了 ES6 模块支持。Node.js 要求 ES6 模块采用 .mjs后缀文件名)


我查看此项目中的其他模块都是使用 CommonJS 规范的 require 方式进行导入的。然后在上面我修改了“type”:“module”。说明此项目需要遵循 ES6 的模块化规范。这样造成了两种规范的混用。通过查阅资料,知道 目前阶段,通过 Babel 转码,CommonJS 模块的 require 命令和 ES6 模块的 impor 命令,可以写在同一个模块里面,但是最好不要这样做。因为 import 在静态解析阶段执行,所以它是一个模块之中最早执行的。(出自 阮一峰的《ES6 标准入门》)
混用可能不会得到想要的结果。


所以最后我在ruoyi-ui\node_modules\@achrinza\node-ipc\entities\Defaults.js内增加的内容是: 
require ('hostname-patcher'); // import patch first

然后执行npm run dev,终于正常了
> ruoyi@3.8.8 dev
> vue-cli-service serve

 INFO  Starting development server...
47% building 315/330 modules 15 active ...js\internals\ordinary-to-primitive.js