后端需要修改: 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.exports,ES6 模块使用 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