作者brli7848 (星の妄想)
看板Soft_Job
标题Re: [讨论] 请大家聊聊 JavaScript的缺陷
时间Wed Jan 6 22:13:58 2021
在开始之前,先说个笑话
※ 引述《keev (a)》之铭言:
: 我会试着反驳 互相交流
然而下面这串推文直接被无视
: 推 vi000246: 还要学打包工具 好麻烦 11/03 00:22
: 推 s06yji3: 要打包真的好麻烦,参数也太多太细。 11/03 00:31
: 推 fiiox3: 打包真的.....从来不觉得自己懂过XD 11/03 00:34
好的,没事干新年开始就考古,我就废.jpg
先来看个实际存在的专案结构在 npm install 後
zettlr/
node_modules/archiver-utils/
node_modules/readable-stream/
node_modules/
inherits/LICENSE
三层啊!大大们!光是一个 lib 就埋了三层啊!
有哪个 C/C++/Java/python 编译完的专案 lib 埋这麽多层的?
我认识的顶多就 /usr/lib/project_name/something.so
或 /usr/lib/python3.??/site_packages/project_name/something.pyc
先不说在 Windows 那种几乎所有软体都吃自己不分享的系统
OSX 跟 Linux/BSD 上面大多都是 shared lib 的情境下,这样搞是要?
喔对了,独眼龙都知道有个 yarn --flat 可以用,但是,在座有成功用这个参数安装後
专案动得起来的吗?
然後,或许有人还记得,早期的 npm 甚至会因为使用者下载源码的时间落差
导致取用的函式库版本更迭,导致明明 package.json 没问题,专案却无法编译的惨况
所以才又出了个 .lock 规格,然後官方还建议这个一定要放进去版控
恩恩,然後就
https://i.imgur.com/jQaZa1A.png
想当然尔,菜鸡小弟就丢去论坛发问,结果回应居然是:
: 请 npx install 某包 -g
: (随回应附上 npm 官方文件来源)
大大!是 -g 啊!在系统固有的套件管理员之外用 global 啊!
是不是没在 package.json 里看过
scripts: {
"postinstall": "",
}
啊?
这随便写加上无脑建议人家 sudo npm -g
有没有突然觉得公司里 IT 呼吸的空气真甜美?
我横竖睡不着,仔细看了半夜的 npm 官方文件,才从字缝里看出字来 NPM_CONFIG_PREFIX
圣光啊!!!
都已经 2020 了,相依管理这种千禧年初就早在业界已经谈到烂、解法多到烂的情况下
js 生态系居然还端出这种垃圾专案管理程式,然後所有人都撇过头去,只敢讨论 NaN 到
底在做什麽、到底有没有符合标准这种技术细节
喔对了,说到直接建议使用者安装新软体
https://github.com/ganeshrvel/npm-electron-root-path/blob/master/lib/index.js
https://github.com/domenic/sorted-object/blob/master/lib/sorted-object.js
从没看过这麽颓废、衰败、小学生等级的套件
後者还天杀的有 382,233 Weekly Downloads!!!
https://www.npmjs.com/package/sorted-object
这种资料结构 101 型还可以写成套件,还可以拿来引用?
业界是多少人懒得写 function 还是不会写而只会 call function? 太疯狂了!!
这还不包括整个社群疯狂重造车轮,
接着写完就抛弃!!!
请问现在要写个 electron app,我该用 electron-builder、electron-forge、还是
electron-packager?
一个写完,然後发现太大太杂不好维护,就他X的另起炉灶,然後整个社群就hype惹
我以为我在观察国高中的童军康辅社团而不是专业人士社群呢颗颗
npmjs.com 上面多少最後更新在两年以上,但是每周下载数依旧很高的套件
喔还有很天才的,按照官方文件写 package.json
结果 npm install 拚命跳出某lib在某版本前有问题,建议更新到某版以上的warning
还有永远会跳出来的fsevent warning,就说我不是Mac了!!!(怒
还没开始写程式,光是搞定框架就挫折连连,是要怎麽举出 JavaScript 的缺陷呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.39.76.65 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1609942455.A.51A.html
1F:推 tommady: 我无法阐述更多,只能推 01/06 22:26
2F:推 deeeplove: 推 01/06 22:30
3F:→ deeeplove: 现在学到崩溃 01/06 22:31
4F:推 abola921: 泪推,同情npm 用户 01/06 22:34
5F:→ LipaCat5566: 这都不是语言本身的问题吧 01/06 22:39
6F:推 zxcasdjason1: npm算是用顺手 但看完你这篇我是感触很深的笑了 01/06 22:45
7F:推 jlhc: 这不是语言的问题那甚麽才是语言的问题... 01/06 22:46
8F:→ jlhc: 笑了给推 01/06 22:47
9F:推 cloudskyblue: 就是这样啊~ ♂ 01/06 22:48
10F:→ cloudskyblue: 摊手 01/06 22:48
11F:→ zxcasdjason1: 但换角度说 js就是弹性大 重构比维护更有效益下 的 01/06 22:49
12F:→ zxcasdjason1: 确是这样呢 01/06 22:49
重构比维护更有效益?
小工程师敢跟 lead 说老子觉得重构比继续每天搅义大利面还有效益?
lead 敢去跟主管说我觉得敝 team 继续每天搅义大利面很无意义,建议重构?
技术主管敢去跟其他部门开会说我觉得公司的软体重构比维护更有效益?
看谁先被钉墙上然後卷舖盖QQ
阿这时候就别羡慕人家其他师字辈可以学一套混30年
是你各位自己说出重构比维护更有效益的呀 大大每隔一下就重构 底下就吃屎重学新东西
帮QQ
13F:推 peterlai: npm 包来包去真的恐怖,还有一堆奇怪的套件 01/06 23:10
14F:推 alihue: 还好我只用 npm is-odd 01/06 23:12
15F:推 lturtsamuel: npm出来还被说是仰赖地狱的救赎 现在被婊成这样 蛮好 01/06 23:15
16F:→ lturtsamuel: 奇大家都用什麽语言跟套件管理的 01/06 23:15
17F:→ lturtsamuel: 我只有rust+cargo 觉得比npm好用 其他java ruby pyth 01/06 23:16
18F:→ lturtsamuel: on感觉问题都比npm多 01/06 23:16
pip 下去,他就是平铺一层 lib/
要找哪个环节的哪个函式库在雷很方便
java 看是哪个框架,至少 gradle 下去也是所有的东西在一个地方排排站
没看过埋了一层又一层嫌人家找的不够开心的
19F:→ lturtsamuel: 顺便问一下 有人用过比cargo更屌的建置工具吗== 01/06 23:18
20F:推 lturtsamuel: 仔细看这篇文章 大部分都是在婊函式库作者 呃 这算语 01/06 23:33
21F:→ lturtsamuel: 言问题吗?那张diff截图也看不出来是要表达什麽问题 01/06 23:33
就是古早时代,同两个被依赖的函式库,只因为安装顺序不同
就没事干产生新lock档搞人
阿然後社群解法是
$ npx npm-merge-driver install -g
22F:→ lturtsamuel: 更令我不能理解的是资料结构为什麽不能写成套件?还 01/06 23:35
cd ../../../ 这种一行文,写成套件被笑刚好而已
资料结构你说爬树还搜寻甚至动到演算法的,写成套件嘉惠後人就算了
swap A B?!
23F:→ lturtsamuel: 有跟你报当前版本有安全性疑虑 你不开心的点是? 01/06 23:35
这是我的错,没讲清楚
我是指说 package.json 里我已经努力使用最新版了
结果某个函式库它的
N层後 的相依有 CVE,然後我要负责?
24F:→ lturtsamuel: 如果你想表达开源函式库的文件过时了 呃 这在哪个语 01/06 23:38
25F:→ lturtsamuel: 言都嘛有 连公司里面文件都时常过时 到底干js屁事 01/06 23:38
26F:推 x123356: 同意楼上 全篇看下来觉得关JS什麽事 01/07 00:03
27F:→ x123356: 前面几篇认真讨论的才真的是JS本身的问题 01/07 00:03
你各位写 JS 到现在都不用 nodejs / npm / npm 衍生物来安装东西?
还是说觉得语言的 flaw 跟它本身奠基在哪个 framework 没有关系?
28F:推 GLaDOS1105: 详细来说这个是 JavaScript 生态的问题 不过的确这和 01/07 00:08
29F:→ GLaDOS1105: 语言本身可以一起讨论 01/07 00:08
30F:推 mirror0227: wwww这篇怨念很深 01/07 00:29
31F:→ x000032001: 大概是只有spec上的才是语言问题 其他都是使用者的毛 01/07 00:40
问题是,就像上面的资料结构
人家 PEP, C conf, C++ std 每年都在努力让语言更好上手,加进一堆常备函式
结果大 JS 生态圈的回应是:「反正社群有」,「不会npm i吗?」,「我就弹性大啊」
灯愣!?是当作所有开发者的网路流量都不用钱?还是觉得讨论 spec 不酷,太古板?
32F:推 lturtsamuel: 工具链或标准库的问题当然也能算是语言一部分 问题这 01/07 00:50
33F:→ lturtsamuel: 篇都婊到开源函式库了...你有闲自己写资料结构别人不 01/07 00:50
34F:→ lturtsamuel: 一定有啊 你可以不爽不要用 特别去婊一个自己不使用 01/07 00:50
35F:→ lturtsamuel: 的函式库 是在干嘛? 01/07 00:50
left-pad 事件言犹在耳
36F:→ lturtsamuel: 这篇唯一讲得有道理的就是那个层层包装的依赖关系 但 01/07 00:52
37F:→ lturtsamuel: 正是这个做法解决了很多c c++ java的依赖地狱 你有没 01/07 00:52
38F:→ lturtsamuel: 有看过因为openssl版本多一位数导致一个c++专案编译 01/07 00:52
39F:→ lturtsamuel: 不过 最後要用一些奇淫手段引入两个openssl 从结果上 01/07 00:52
40F:→ lturtsamuel: 来说做的就是npm一样的事情 01/07 00:52
一个专案引用同一个函式的两个版本,这是工程师在雷的问题吧?
要同时支援两个版本是你组织的问题还是程式的问题?
这里说的是同一个释出版,而不是只说为了承诺而维护老版本的专案
41F:推 lturtsamuel: 在c++引入两个不同版本的lib才叫痛苦咧 什麽symbol冲 01/07 00:55
42F:→ lturtsamuel: 突header冲突 搞死你 01/07 00:55
你可以重新针对新symbol/header编译…
喔对了,要用函式库就乖乖去跟好人家的释出管道跟新闻…
当然,这种习惯被 nodejs 生态系搞到光 track down 就炸裂那就是另外一回事惹
43F:推 guanting886: 推怨念深 01/07 01:16
44F:→ guanting886: 可是这是NPM捏XD 01/07 01:17
所以最後才会说都还没开始探讨 JS 语言本身,光是怎麽开始就已经全身是伤了
45F:推 askaleroux: 专案最近用Lerna 全部都monoRepo 01/07 01:44
46F:→ askaleroux: 最近用一些套件真的他妈赌烂 01/07 01:45
47F:→ askaleroux: 干都不写type的 我写type script找不到function用 01/07 01:45
48F:→ askaleroux: 都要一个一个通灵去看 妈的 01/07 01:45
49F:→ askaleroux: javascript要是我可以不要用 鬼才想用 01/07 01:45
50F:推 Bencrie: 耶 其实现在有多一层啦 /usr/lib/x86_64-linux-gnu/ 01/07 02:11
至少人家都一起在 lib/x86_64-linux-gnu/下排排站,顶多因为专案太大,提供太多lib
所以多一层像是 qt5/libQt5Core.so 这样子把自己的东西都放一起
还一层一层往下放 lib/ 资料夹咧?吓死人
51F:推 tsao1211: 生态也算是一部分,没生态根本也不会有人讨论 01/07 03:30
52F:嘘 MoonCode: 01/07 05:41
本篇第一嘘,恭喜
53F:推 superpai: 你可以改用bower啊 01/07 05:52
While Bower is maintained, we recommend using Yarn and Webpack or Parcel for
front-end projects
虽然 Bower 有在维护,但是前端专案我们
建议使用 yarn 加上 webpack 或 parcel
不是我说的喔,
https://bower.io 标题下面第一行
54F:推 OhNo386: js问题就是太容易学了,才会ㄧ堆人学然後一堆人重复造轮 01/07 06:26
55F:→ OhNo386: 子,不过这应该很难避免,易学难精总还是有它的代价。 01/07 06:26
56F:→ OhNo386: 这应该都是高阶语言的通病啊 01/07 06:31
57F:→ jobintan: 要用NPM打包的JS我都会与React一块用。 01/07 07:15
58F:→ jobintan: 不过我都用Yarn居多。 01/07 07:15
说真的啦,反正都会跳警告,至少 yarn 还会跟你说是几层後的东西有人戳
npm呢?
found 15 low severity vulnerabilities
run `npm audit fix` to fix them, or `npm audit` for details
然後就,过去惹@@?!
喔对了, npm audit fix 後有机率这个刚 clone 下来的专案会直接 error 给你看
59F:→ meowyih: 都二个月前的文了还挖起来继续战啊... 01/07 09:03
60F:→ ab4daa: 可怜哪 01/07 09:04
61F:推 Csongs: 自己写side project 也很痛苦,不知业界node js怎管 01/07 09:10
※ 编辑: brli7848 (114.39.76.65 台湾), 01/07/2021 10:34:24
62F:推 mmis1000: 我倒是希望全世界都是结构阿,要不至少也强制不同版本路 01/07 10:34
63F:→ mmis1000: 径不冲突,那种同时跑两个专案会因为全域依赖冲突跑不起 01/07 10:34
64F:→ mmis1000: 来的依赖管理简直笑死人,没docker我都不知道怎麽办 01/07 10:34
apt, dnf, yast, pacman 应该都遇不到这个问题?
65F:→ shadow0326: venv: 01/07 10:41
好用
66F:推 mmis1000: 然後我不知道你用的npm到底是几个版本前的,他大概 3 年 01/07 10:41
67F:→ mmis1000: 前装出来的就是平的了,你的工具到底多老 01/07 10:41
btw, I use Arch.
没意外应该 nodejs, npm 都是最新的稳定版
68F:→ SoftwareSing: npm 现在装的都是平的 01/07 11:31
69F:→ SoftwareSing: 除非你曾经有不同lib依赖同一个lib的不同版本 01/07 11:32
71F:→ SoftwareSing: 但都是用B的同一个版本的情况,装出来会是平的 01/07 11:45
那个三层结构是去年7月间去戳程式时的实际情况
以你的例子不就是因为依赖的上游有人偷懒只用旧版
导致依赖性一直往下长吗?
阿这个旧版刚好依赖一个旧版的上游...,boom! cve warning!!
72F:推 lturtsamuel: 笑了 我要用的两个函式库要依赖两个openssl版本 我能 01/07 15:12
73F:→ lturtsamuel: 怎麽办 01/07 15:12
看来只能用妖术了呢…拍拍
已经compiled出来还不能改原码重编的函式库,有时候就…很难搞呀
74F:推 jlhc: 现在是比烂就是了xdxd 01/07 15:25
※ 编辑: brli7848 (42.77.106.21 台湾), 01/07/2021 17:02:51
75F:→ leo5916267: Js写的越深越觉得自己一直在绕圈圈, 01/07 18:14
76F:→ xatier: 某楼一直绕圈圈,不愧是写 JS 的高手ㄋ 01/07 19:56
77F:→ xatier: 工具帮忙解决相依性问题是一回事,生态圈鼓励大家随便一把 01/07 19:57
78F:→ xatier: 抓相依性,从不去思考是不是一定非得引入这个相依,出事了 01/07 19:58
79F:→ xatier: 就硬 override ,那才是真正的问题。说到底不是 JS 本身的 01/07 19:58
80F:→ xatier: 问题,而是生态圈主流作法和 **人的问题** ^^ 01/07 19:58
81F:→ xatier: 再好的依赖管理工具也无法解决习惯乱拉依赖的人 01/07 20:02
82F:推 SmallpTsai: 说的好 XDDD 01/07 22:36
83F:→ ku399999: 虽然已经有人解释npm了 但我还是想贴个笑话 01/08 10:13
85F:推 strlen: 那都是套件的问题 跟语言本身无关(捧读 01/08 11:55
86F:推 Geison: 这怨念,是受了什麽刺激哈哈 01/08 13:36
87F:推 mmis1000: apt那叫哪门子的能选版本…你就只能用他上面有的阿,要 01/08 13:54
88F:→ mmis1000: 是没有,你要嘛重写程式要嘛自建repo 01/08 13:54
是不知道你是用了什麽软体,版本会在 apt 找不到啦…
通常 Ubuntu 会提供至少同一套 lib 的两个版本,像是 openssl2/1.1
你要的上面找不到,有两个可能
1. 你要的太新,选的发行版太旧:要麽就自己用系统 toolchain 编新版甚至架 repo
要麽更新系统的版号←可能会被炸(无论是公司或是系统)就是惹
2. 你要的太旧,选的发行版没收:那就乖乖重写阿…连 py2转3都要考虑半天的 u 家都
不收的东西,可能连上游都不想理了,遇到bug/安全漏洞向谁哭?
喔,另外一种情况,你的 apt 是指 Debian,那就…docker 罗
89F:推 mmis1000: 另外,目录结构是lock的一部分,如果这个专案过去的安装 01/08 14:03
90F:→ mmis1000: 方式就是超深树状,那同一个lock安装後的结果也会是 01/08 14:03
好问题,那要怎麽更新 lock,然後避免在协作下更新 lock 导致 git 大塞车大抱怨?
或许现在近期好很多了啦,但是如我上面截图,这种自己换位子的
要怎麽让同组其他同事不炸conflict?
91F:推 newjett0617: 推 01/08 23:17
※ 编辑: brli7848 (42.77.23.173 台湾), 01/09/2021 13:17:02
92F:→ cy91244: 只要用 npm ci 就不会动到lock file;升级或新增deps就 01/09 18:30
93F:→ cy91244: 要发PR,merge後其他人再npm ci安装。 01/09 18:30
94F:→ brli7848: 问题是不动lock就是要面对那个积尘已久的超深树状啊 01/09 19:54
96F:→ brli7848: 2018…我第一次掉坑的时候是2015呢…当时什麽都… 01/09 19:57
97F:→ cy91244: 可以动啊,你想要 npm dedup 也行,就是动了就是发 PR 01/09 21:29
98F:→ cy91244: 其他人一样等merge 後再 npm ci 01/09 21:29
恩,刚好验证我上面回的
上面一脑冲重构,底下就得吃屎学新东西
好好的 npm i 不维护,结果只能跑去生一个新的 ci 指令
然後社群里就充斥着楼上的解法「阿你可以这样绕一圈就过啦」
问题是…整个网路上累积几年的 npm i 教学,然後…现在是每个新人都要踩一遍雷?QQ
99F:推 daddy29: 前端脑 河河 01/09 22:28
100F:推 Nitricacid: 精辟 01/10 11:58
※ 编辑: brli7848 (42.77.23.173 台湾), 01/10/2021 15:03:32
101F:推 clang: 推怨念深 01/17 21:15