如何防止 Node.js 频繁修车

2022-09-21 16:49:49 +08:00
 join
如题,我很少能够顺利的跑起来一个 Node.js 项目,每次都会遇到各种各样的包管理引入的坑。
有什么 Node.js 最佳实践能让我们少修点车?
9795 次点击
所在节点    Node.js
97 条回复
momocraft
2022-09-21 18:02:11 +08:00
npm 确实坑
期待 node 有 xhr 的人和 npm 谁更坑 我不好说
codingBug
2022-09-21 18:17:33 +08:00
@rekulas 没有冷嘲热讽,遇到未知的问题,要学会进入源码中调试,还有环境问题,如果没有使用容器的话,Linux 、Mac 、Win 可能会有不一样的效果,可能是第三方包的 bug ,也可能是环境问题,也有可能是编译配置问题
Pastsong
2022-09-21 18:22:22 +08:00
用 yarn 和 yarn.lock
npm 安装依赖的坑主要在好好的跑 npm install ,后台跑起来一堆 python ,cmake 在跑编译,从 github 下载二进制,卡在和 js 无关的东西上
js 的部分跑不起来看打断点看 log 还是很好解决的吧
shyling
2022-09-21 18:22:46 +08:00
@lmshl 确实如此
join
2022-09-21 18:27:30 +08:00
@Pastsong 你这句话里引入了两个包管里器( yarn 和 npm ),两门编程语言( python 和 js ),一个构建工具( cmake )。
出了问题最容易搞定的恐怕是 cmake ,其次是 python 。
join
2022-09-21 18:28:48 +08:00
@zbinlin 你确定? MDN 可没教过你怎么修 npm 的车吧,另外就是你所谓的基础知识在哪里?整个 nodjs 官网也没教你怎么修车或者避免翻车。
bwangel
2022-09-21 18:30:42 +08:00
@Pastsong

python 也有这个问题,好好地安装一个 cryptography 包,结果开始用 cargo 进行编译了。

https://github.com/pyca/cryptography/tree/main/src/rust

我觉得是这些语言的社区有问题,光想着用 C/Rust 重写关键组件提供性能了,C 代码的依赖怎么管理,完全提供合适的解决方案。
bwangel
2022-09-21 18:31:32 +08:00
@bwangel #27 s/完全提供 /完全没想着提供 /
shakukansp
2022-09-21 18:35:02 +08:00
不熟悉当然很容易踩坑啊
npm 那个依赖包的版本
带^的比如^1.8.18 ,不是锁定在这个版本,而是会安装小版本的更新,然后里面就可能会有 break change
所以上面有一楼回复让你把版本前面的符号去掉就锁定这个版本了
Mexion
2022-09-21 18:35:20 +08:00
npm 确实坑
期待 node 有 xhr 的人和 npm 谁更坑 我不好说
kid740246048
2022-09-21 18:35:40 +08:00
@rekulas #19
你遇到的问题一般 package-lock/yarn.lock 就能解决,可以锁住主动安装的依赖版本以及依赖的依赖版本,看文中描述应该是一开始没用。
更进一步可以考虑依赖预打包,直接把某个依赖以及它的依赖打成一个 js 文件,然后加到 git 中管理版本。这种情况下除非手动更新,否则不会被影响。
Envov
2022-09-21 18:43:31 +08:00
依赖都是版本问题导致的,比如 node-sass 经常会出现,固定一个版本后基本就好了,好奇别的语言不会出现类似的问题吗
zbinlin
2022-09-21 18:44:10 +08:00
@join 如果是 npm 的问题,就去 npm 的官网或 issue 里找。如果是包的问题就去具体包的仓库里找答案。怎么使用搜索引擎也是一种基础知识。

@rekulas 抱歉,没有时间。
join
2022-09-21 18:50:19 +08:00
@zbinlin 谢谢回复,礼貌待人是一种社会生存基础知识。已拉黑。
EscYezi
2022-09-21 18:52:36 +08:00
还遇到过本地的一个项目,之前都好好的,没有任何修改,过了两个月,npm run 就报错,改了一堆依赖才解决……
bwangel
2022-09-21 18:55:14 +08:00
> 好奇别的语言不会出现类似的问题吗

我对 go 熟悉一些,我觉得 go 的依赖管理做的比 python/nodejs 好太多了

@Envov

1. golang 自动锁定了版本,当你从 gihtub clone 一个项目下来以后,如果不手动升级,go mod tidy 不会自动给你升级

2. golang 中虽然也使用 cgo 的库,但大部分能用 go 重写的都用 go 写了。很少遇到像 python 的 confluence-kafka 这种依赖一个 C 库( librdkafka ) 的项目(这个 C 库需要你用 apt / yum 的方式安装,控制版本很困难,很容易破坏系统的环境)。https://github.com/confluentinc/confluent-kafka-python/blob/master/src/confluent_kafka/src/confluent_kafka.h#L23
3. golang 所有项目的依赖都存放在 GOPATH/pkg/mod/ 中,不会像 npm 那样产生 node_modules 黑洞
angryPHP
2022-09-21 18:55:17 +08:00
就是报错,啥原因咱也不知道
rekulas
2022-09-21 18:56:23 +08:00
@kid740246048 感谢回复,但是可能对我来说不是好办法。首先我们无论 dev 还是生产环境都是开启 lock 的,但并没有阻止问题。如果转 yarn 的话也许是个办法(还未测试),但小项目还好,大项目转恐怕未必会很顺利,npm/pnpm 兼容度足够高了吧,仍然有些项目不支持 pnpm-或者你需要手动解决很多依赖问题,得不偿失。
依赖打包这个是能解决, 但是太不优雅了,我们还是考虑的锁定版本方案
zbinlin
2022-09-21 18:56:56 +08:00
@join 欢迎
Pastsong
2022-09-21 19:13:40 +08:00
@join 我这边说 npm install 是指代 npm script 的名称,实际使用中你应该使用固定的 npm 管理工具 npm 、pnpm 、或 yarn 。
python 、c++ 不是我引入的,是 npm 的包引入的,以 npm 哲学黑盒引用的哲学是不需要关心包的实现的,但它在这些依赖其他语言的编译出错的时候是几乎不可能 debug 的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/881929

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX