百度脑图 编译日志
系统环境
- Node.js:
- Windows下:v14.13.1
- Arch Linux下,NVM切换:9.0.0/12(LTS版)/14.13
- NPM: v6.14.8
第一次尝试
最初的编译步骤
- 克隆源码后,
cnpm install、bower install安装所有依赖 npm run start开始编译- 新版本Node.js下我手动更新了graceful-fs到
@^4.2,否则报错。在9.0版本Node.js中该组件不存在此问题,可忽略。
配置文件
- Windows下,根据文档Dev.md一路安装各种组件。<del>走弯路了。。。</del>
- Arch Linux下重来,没有修改
package.json。直接npm install安装全部依赖,不再逐一安装。
最终两系统都出现了同样的编译错误。
结果卡在这地方。。。
[08:48:33] Using gulpfile D:\WUDownloadCachee\DesktopNaotu\gulpfile.js
[08:48:33] Starting 'default'...
[08:48:33] Starting 'clean-dist'...
[08:48:33] Finished 'clean-dist' after 60 ms
[08:48:33] Starting 'build-version'...
version -> 3.2.3.525
[08:48:33] Finished 'build-version' after 44 ms
[08:48:33] Starting 'compile'...
[08:48:33] Compiling TypeScript files using tsc version 3.9.7
[08:48:39] [tsc] > app/src/core/exec.ts(18,32): error TS2769: No overload matches this call.
[08:48:39] [tsc] > The last overload gave the following error.
[08:48:39] [tsc] > Argument of type '{ encoding: string; }' is not assignable to parameter of type 'BaseEncodingOptions & ExecOptions'.
[08:48:39] [tsc] > Type '{ encoding: string; }' is not assignable to type 'BaseEncodingOptions'.
[08:48:39] [tsc] > Types of property 'encoding' are incompatible.
[08:48:39] [tsc] > Type 'string' is not assignable to type 'BufferEncoding'.
[08:48:39] [tsc] > app/src/lib/dialog.ts(23,9): error TS2345: Argument of type '{ filters: { name: string; extensions: string[]; }[]; }' is not assignable to parameter of type 'BrowserWindow'.
[08:48:39] [tsc] > Object literal may only specify known properties, and 'filters' does not exist in type 'BrowserWindow'.
[08:48:39] [tsc] > app/src/lib/dialog.ts(76,7): error TS2345: Argument of type '{ title: string; defaultPath: string; filters: { name: string; extensions: string[];
}[]; }' is not assignable to parameter of type 'BrowserWindow'.
[08:48:39] [tsc] > Object literal may only specify known properties, and 'defaultPath' does not exist in type 'BrowserWindow'.
[08:48:39] [tsc] > app/src/lib/dialog.ts(97,9): error TS2345: Argument of type '{ properties: string[]; defaultPath: string; }' is not assignable to parameter of type 'BrowserWindow'.
[08:48:39] [tsc] > Object literal may only specify known properties, and 'properties' does not exist in type 'BrowserWindow'.
[08:48:39] [tsc] > app/src/lib/dialog.ts(142,7): error TS2345: Argument of type '{ title: string; defaultPath: string; filters: any[]; }' is not assignable to parameter of type 'BrowserWindow'.
[08:48:39] [tsc] > Object literal may only specify known properties, and 'defaultPath' does not exist in type 'BrowserWindow'.
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(1674,31): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(3079,31): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(3519,25): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(3696,26): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(4249,30): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(4645,33): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(5233,36): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(5241,33): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(5579,30): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(6474,32): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(6515,25): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(7646,37): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(7658,31): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(7668,31): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(7681,33): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(7693,34): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(7709,42): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(7722,32): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(7736,32): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(7857,22): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] [tsc] > node_modules/_electron@9.3.2@electron/electron.d.ts(8366,29): error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
[08:48:39] Failed to compile TypeScript: Error: tsc command has exited with code:2
第二次尝试
前文中出现的这一系列日志,实际上是因为新版本Electron暂不支持@types/node的最新版本(v14):
error TS2689: Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
更换@types/node为12.x版本,即可解决。
cnpm install @types/node@12.x
同时注意保持TypeScript为3.9.x版本(最新的4.x也可),Node.js为9.x(或更新了graceful-fs后的14.x)。
于是,新的编译错误出现了。。。
[17:42:21] Using gulpfile D:\WUDownloadCachee\DesktopNaotu\gulpfile.js
[17:42:21] Starting 'default'...
[17:42:21] Starting 'clean-dist'...
[17:42:21] Finished 'clean-dist' after 78 ms
[17:42:21] Starting 'build-version'...
version -> 3.2.3.535
[17:42:21] Finished 'build-version' after 37 ms
[17:42:21] Starting 'compile'...
[17:42:21] Compiling TypeScript files using tsc version 4.0.3
[17:42:28] [tsc] > app/src/lib/dialog.ts(23,9): error TS2345: Argument of type '{ filters: { name: string; extensions: string[]; }[]; }' is not assignable to parameter of type 'BrowserWindow'.
[17:42:28] [tsc] > Object literal may only specify known properties, and 'filters' does not exist in type 'BrowserWindow'.
[17:42:28] [tsc] > app/src/lib/dialog.ts(76,7): error TS2345: Argument of type '{ title: string; defaultPath: string; filters: { name: string; extensions: string[];
}[]; }' is not assignable to parameter of type 'BrowserWindow'.
[17:42:28] [tsc] > Object literal may only specify known properties, and 'defaultPath' does not exist in type 'BrowserWindow'.
[17:42:28] [tsc] > app/src/lib/dialog.ts(97,9): error TS2345: Argument of type '{ properties: string[]; defaultPath: string; }' is not assignable to parameter of type 'BrowserWindow'.
[17:42:28] [tsc] > Object literal may only specify known properties, and 'properties' does not exist in type 'BrowserWindow'.
[17:42:28] [tsc] > app/src/lib/dialog.ts(142,7): error TS2345: Argument of type '{ title: string; defaultPath: string; filters: any[]; }' is not assignable to parameter of type 'BrowserWindow'.
[17:42:28] [tsc] > Object literal may only specify known properties, and 'defaultPath' does not exist in type 'BrowserWindow'.
[17:42:28] Failed to compile TypeScript: Error: tsc command has exited with code:2
最后一弹。。刚刚猛然发现
思来想去,还是参考下最新版release。用asar解开release安装目录的resources/app.asar,阅读package.json,发现用了以下版本的库:
...
"devDependencies": {
"@babel/core": "^7.1.2",
"@types/byline": "^4.2.31",
"browserify": "^16.2.3",
"del": "^3.0.0",
"electron": "^3.0.11",
"electron-packager": "^12.2.0",
"electron-prebuilt": "^1.4.13",
"grunt": "^1.0.3",
"grunt-electron-installer": "^2.1.0",
"gulp": "^3.9.1",
"gulp-autoprefixer": "^6.0.0",
"gulp-babel": "^8.0.0",
"gulp-cache": "^1.0.2",
"gulp-clean-css": "^3.10.0",
"gulp-concat": "^2.6.1",
"gulp-connect": "^5.6.1",
"gulp-filter": "^5.1.0",
"gulp-imagemin": "^4.1.0",
"gulp-jshint": "^2.1.0",
"gulp-livereload": "^4.0.0",
"gulp-main-bower-files": "^1.6.3",
"gulp-minify-css": "^1.2.4",
"gulp-notify": "^3.2.0",
"gulp-obfuscate": "^0.2.9",
"gulp-rename": "^1.4.0",
"gulp-ruby-sass": "^3.0.0",
"gulp-tsc": "^1.3.2",
"gulp-uglify": "^3.0.1",
"js-beautify": "^1.8.6",
"jshint": "^2.9.6",
"run-sequence": "^2.2.1",
"tsify": "^4.0.1",
"typescript": "^3.2.2",
"vinyl-source-stream": "^2.0.0",
"wiredep": "^4.0.0"
},
"dependencies": {
"hotkeys-js": "^3.3.8",
"moment": "^2.23.0",
"winston": "^3.1.0"
}
...
其中Electron居然是3.x的版本。安装这个版本试试看,保持其他依赖不变:
cnpm install electron@3.x
gulp
果然顺利编译!
最后运行测试。再在工程package.json中添加一行:
@@ -5,6 +5,7 @@
"main": "dist/main.js",
"scripts": {
"start": "gulp default",
+ "demo": "electron .",
"packwin32": "cross-var electron-packager ./ DesktopNaotu --asar --platform=win32 --arch=ia32 --out=../OutApp --icon=app/static/favicon.ico --electron-version=3.0.10 --app-version=$npm_package_version --ignore=\"(.git|screenshot|doc|src|app|bower_components|electron-packager)\" --overwrite --prune",
"packwin32dev": "cross-var electron-packager ./ DesktopNaotu --platform=win32 --arch=ia32 --out=../OutApp --icon=app/static/favicon.ico --electron-version=3.0.10 --app-version=$npm_package_version --ignore=\"(.git|screenshot|doc|bower_components|electron-packager)\" --overwrite --prune",
"packwin64": "cross-var electron-packager ./ DesktopNaotu --asar --platform=win32 --arch=x64 --out=../OutApp --icon=app/static/favicon.ico --electron-version=3.0.10 --app-version=$npm_package_version --ignore=\"(.git|screenshot|doc|src|app|bower_components|electron-packager)\" --overwrite --prune",
然后
npm run demo
成功运行了起来!
关于打包速度慢的问题
使用npm run packwin64进行打包时,发现打包速度非常慢,起码要等几个小时。CMD下设置环境变量DEBUG(set DEBUG=*)时,可看到electron-packager在不断遍历node_modules文件夹。
后来参考了这篇问答里苹果小萝卜的解决办法,才得知使用cnpm安装软件包是问题所在。它属于扁平化安装,会把所有依赖全部展开到node_modules文件夹中,这样赢得了速度,却导致文件夹下有超过1,800个项目,怪不得要遍历那么久。
于是删掉node_modules文件夹,用npm再重新安装。由于npm采用树形结构处理依赖,最终node_modules非常简洁,只有723个项目。打包速度快了不少。
可适用的编译教程
软件版本
- Node.js:
v9.x、v12.x LTS、v14.xv10.x在运行gulp-tsc时会提示语法错误,不选。- 建议
v9.x。模块graceful-js不兼容高版本的Node.js,但你可以手动更新。
- TypeScript:
v3.9.x、v4.0.x
1. 安装所有依赖
## 自动安装依赖
npm install
bower install
## 安装编译工具 Gulp
npm install -g gulp
2. 更换graceful-fs版本(对于Node v10.x及以上版本)
npm install graceful-fs
## 如果仍出现"ReferenceError: primordials is not defined" 的错误,
## 则删掉旧版本
rm -rf node_modules/_graceful-fs@3.0.12@graceful-fs
## 如果某个子模块依赖旧版本graceful-fs,则请根据报错信息,
## 切换到该模块目录下更新。
cd node_modules/<PATH_TO_MODULE_USING_DEPRECATED_GRACEFUL_FS>
npm install graceful-fs@4.x
cd node_modules/vinyl-fs
yarn add graceful-fs@4.x
cd ../../
cd node_modules/gulp-tsc
yarn add graceful-fs@4.x
cd ../../
cd node_modules/gulp-tsc/node_modules/vinyl-fs
yarn add graceful-fs@4.x
cd ../../../../
3. 更换@types/node版本
npm install @types/node@12.x
4. 开始编译
gulp
5. 测试运行
npm run demo
TRAE-AI编程


更多建议: