一直有一个疑惑: Standard JS 这个编码规范是为什么火起来的呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
shintendo
V2EX    Javascript

一直有一个疑惑: Standard JS 这个编码规范是为什么火起来的呢?

  •  
  •   shintendo 2020-12-02 15:03:52 +08:00 5249 次点击
    这是一个创建于 1774 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我理解的 Standard JS 的理念就是:“为哪种编码风格更好而争吵是浪费时间的,我有一种方案可以解决这种无意义的争吵,那就是大家都听我的。”

    楼主自己对编码风格没有很强的偏向,基本上项目是什么风格我就适应什么风格,所以并不是觉得 Standard JS 的内容有什么问题,而是觉得这个理念特别奇怪,有点何不食肉糜的感觉。

    假设 Standard JS 项目是这样:针对每一条规则(如分号、tab 、括号换行等),统计 npm 上的所有包,取多数人使用的那一种,那么这个项目最终得出来的编码风格可能很奇怪,可能我不喜欢,但我会觉得这个项目是有意义的,至少是有趣的。但像现在这样的我就不太能理解了,不就是一个新时代的 JSLint 吗?为什么 JSLint 已经扫进了垃圾堆的今天,Standard JS 却能火起来,这背后是否有我不了解的差别呢?

    Again,这个贴并不是对 Standard JS 的规则内容不满,而是对它流行的原因不太理解。

    第 1 条附言    2020-12-03 14:21:45 +08:00
    好像楼歪了,变成分号问题了,其实本人是无分号党,但不可否认无分号党是较少数,在一个名为 Standard 的规范里采用无分号规则有点任性,也不符合项目宣称的“搁置争论”理念。

    很多回答提到开箱即用、不可配置,我的疑惑也是来源于此:如果大众需要一个不可配置的 lint 工具,那么当初的 JSLint 又是为什么被 JSHint 所取代呢?
    23 条回复    2020-12-05 20:34:11 +08:00
    whosesmile
        1
    whosesmile  
       2020-12-02 16:04:12 +08:00
    我大概能理解这个项目流行的原因,因为工作原因以前经常搭建脚手架,以前是 eslint,后来换 prettier,再后来两者结合,再往后 Angular 、React 、Vue 、TypeScript,Tslint,总有新的框架和语法规则让我对项目代码的格式化规范疲于应对。

    回想最开始抛弃 eslint 换成 prettier 的原因就是省心,不过那会好歹 prettier 合我意,现在 Standard JS 强制取消分号其实让我很别扭,但是再想想初衷,我觉得这种事就是没有对错,根本争论不出结果,索性找个中立派吧,大家都公平了。
    aegisho
        2
    aegisho  
       2020-12-02 16:56:53 +08:00
    Standard js 提供了一套配置,也比较流行,airbnb 的,就比较严格,有时候还会影响实际开发。需要手工裁剪
    团队看重的是统一性,如果有人愿意接手,并长期维护,自行定义一套也没啥问题

    关键是不要出现 “屎色的自行车棚” 问题,在无关紧要的地方投入大量的时间争吵
    加不加分号争吵也是前几年的日常了,实际上有那么重要吗?
    KuroNekoFan
        3
    KuroNekoFan  
       2020-12-02 17:13:46 +08:00
    不是东风压倒西风,就是西风压倒东风,假设一个 codebase 同时存在两种缩进风格 /换行风格,那确实也会带来不少麻烦
    cmdOptionKana
        4
    cmdOptionKana  
       2020-12-02 17:16:43 +08:00
    Standard JS 不是单独火起来的,而是很多人都发现了争论编码风格是个大问题,都想解决这个问题,比如 python 官方提出了 PEP 8,Golang 官方更是从一开始就提供 gofmt 限死风格。

    Javascript 自然也需要一个类似的东西,而这个东西只能是 Standard JS (当时 js 这边也没别的类似项目)

    JSLint 是完全不同的,不是一类东西,JSLint 可以自由配置,但人家要的是不能配置。
    EPr2hh6LADQWqRVH
        5
    EPr2hh6LADQWqRVH  
       2020-12-02 17:18:57 +08:00   1
    谁取消分号了,打爆他的狗头
    Sivan
        6
    Sivan  
       2020-12-02 17:20:16 +08:00
    只是起了一个好名字,项目本身并没有任何对标准有指代之意。流行的一个原因是上一个流行的规范 Airbnb Javascript Style Guide 太严格了,换到 StandardJS 你会感觉如释重负。

    用的多了会感受到前端内部这种基础的编码风格争议有多糟心,向楼上说的 gofmt 从根本上解决其实更好一些。
    shintendo
        7
    shintendo  
    OP
       2020-12-02 17:56:31 +08:00
    @cmdOptionKana JSLint 是 Douglas Crockford 那个,是不能配置的吧,记得当时也是因为不能配置而被吐槽,进而被 JSHint 取代的
    shintendo
        8
    shintendo  
    OP
       2020-12-02 18:00:12 +08:00
    其实我最主要的困惑就是 Standard JS 流行的原因和 JSLint 被淘汰的原因是不是同一个原因:不可配置?
    kidlj
        9
    kidlj  
       2020-12-02 18:22:20 +08:00
    名字取得好
    anguiao
        10
    anguiao  
       2020-12-02 18:26:57 +08:00 via Android
    Prettier 前几天也更新了文档,说不会再添加新的配置项。
    Prettier 其他地方我都挺满意的,但是它的“>”非要写在下一行,还不提供配置项,只有 React JSX 可以配置。
    yodhcn
        11
    yodhcn  
       2020-12-02 18:49:56 +08:00
    我也不太明白,Standard JS 真的能取代 eslint 和 Prettier 吗?
    eslint 可以通过配置插件,来增加一些特殊的规则比如 "plugin:node/recommended" 等,但 Standard JS 的规则覆盖足够全面吗?
    marcong95
      &nsp; 12
    marcong95  
       2020-12-02 21:36:55 +08:00 via Android
    一般不都是 eslint extends: ["standard"]的么,直接上 standard 这么猛?
    BoarBoar
        13
    BoarBoar  
       2020-12-02 22:28:34 +08:00
    其实还是约定大于配置的思想,应用到了风格上
    而过去十年约定大于配置确实极大提高了开发效率,不信你用 10 年前的 Java SSH 写一个 Hello World 试试
    go 还从语言层面就统一风格了呢,不符合他风格的都不给你编译通过
    lishen226
        14
    lishen226  
       2020-12-02 23:00:51 +08:00
    @avastms 谁取消分号了,打爆他的狗头
    chloelam101
        15
    chloelam101  
       2020-12-02 23:06:21 +08:00
    主要是 Standard 配置开箱就用,免去各种项目对接的时间,更重要是 vue2 团队时及周边插件都是 Standardjs, 受 vue 影响,其他周边作者也加入了,但现在,react17+ ag11+vue3 其实现在主流往 typescript 走的,都以 typescript 的官方的 eslint 为主要,世界又变了。
    jones2000
        16
    jones2000  
       2020-12-02 23:21:51 +08:00
    喜欢怎么写,就怎么写, 不报错,能跑通就行。
    规范是死的,人是活的, 活人还能给规范憋死。
    lmoon
        17
    lmoon  
       2020-12-02 23:28:52 +08:00 via Android   1
    seki
        18
    seki  
       2020-12-02 23:45:15 +08:00
    现在 standardjs 还流行吗?感觉已经是前 eslint 时代的产物了,有了 eslint 的 auto fix,再加上编辑器和 git hook 的 fix on save,想怎么配置就怎么配置,多开心
    seki
        19
    seki &nsp;
       2020-12-02 23:46:35 +08:00
    对于寻找适合自己和团队的 eslint 规则的方式,我觉得与其在 standard js 上做加法,不如在 airbnb 上做减法,更容易让大家接受
    muzuiget
        20
    muzuiget  
       2020-12-03 08:42:25 +08:00
    我就认为这个是垃圾项目,成功无非就是取了个哗众取宠的名字。

    为了省略句末的分号,产生歧义时,却要把分号写在句首,简直滑天下之大稽,还叫自己“Standard”,标题党中的标题党了。
    libook
        21
    libook  
       2020-12-03 10:38:27 +08:00   1
    因为名字吧,至今还有很多人以为这个是 JS 官方要求的标准。。。

    ES 标准是有分号的,引擎分号补全本身就是一种容错机制,TC39 也强调了不写分号的风险,以及未来 ES 要加入的新特性会使得引擎的分号补全机制变得异常难以实现。

    从好的方面来说,Standard JS 为有需求的团队提供了一个开箱即用的代码风格方案,你不需要自己研究每一项规则,也不需要配置,由 Standard JS 来保证统一、可用、高效。
    从不好的方面来说,Standard JS 推荐了一些有风险的代码风格,这些风格和一些写法搭配会有严重的问题,Standard JS 的做法就是把这些会有问题的搭配写法屏蔽掉,从而做到在 Standard JS 约束下不会发生风险;但有的人写习惯后在没有 Standard JS 约束的场景也会使用这些有风险的代码风格,没有 Standard JS 帮忙做检查,很可能最终写出有严重缺陷的代码。

    个人推荐的是 Lint 规则仅限制那些真的会导致问题的写法,这些问题包括逻辑问题、语法问题、可读性问题等,至多可以加入一些团队达成共识的风格规则。

    另外,风格中很多部分也可以通过 EditorConfig 机制来解决,主流编辑器、IDE 是支持这个机制的,会自动应用项目下的.editorconfig 文件中的配置内容。

    JS 是一种极其灵活的语言,入门很简单,但要想用好需要大量的知识储备和使用经验,TS 、Go 等在这方面难度低很多。
    ericgui
        22
    ericgui  
       2020-12-03 14:04:57 +08:00
    所以还是 Java 好
    dfzj
        23
    dfzj  
       2020-12-05 20:34:11 +08:00
    什么是 Standard JS?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     995 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 18:40 PVG 02:40 LAX 11:40 JFK 14:40
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86