标签 Javascript 下的文章

TypeScript 的使用率在不断上升,Svelte 的开发者 Rich Harris 解释了为什么反其道而行,从 TypeScript 切换到 JavaScript 和 JSDoc。

Svelte 的一个将 TypeScript 转为 JSDoc 的拉取请求引起了一些困惑的评论。评论中有人说:“这个改变是出于什么原因呢?我在到处寻找这个问题或相关讨论,但我没有找到。” 随后,这个问题在 GitHub 上因“讨论过于激烈”而被锁定回复。

在上个月的一次 Svelte Society 采访中,Harris 提供了进一步的背景信息,他说:“我们决定要做的一件事就是在 Svelte 核心代码库中脱离 TypeScript,转向使用 JavaScript。这里有一些细微的复杂性我未曾充分解释。”

他持有的观点是:“类型是非常好的,但是 TypeScript 确实有些困扰…… 当你开始使用 .ts 文件后,你就必须有相应的工具来支持…… 当你使用像 TypeScript 这样的非标准语言时,你会遇到很多阻碍,我已经开始认识到这并不值得。因此,我们将我们所有的类型都放入了 JSDoc 注解中,我们也能获得所有的类型安全性,但没有任何的缺点,因为它就是 JavaScript,所有的东西都在注解中,你可以直接运行代码。这就是我们在 Sveltekit 代码库中所做的,它在 Svelte 4.0 中表现得非常好,所以我们决定对 Svelte 同样采取这种方式,因为这将让我们能够更快速地前进。”

虽然 Svelte/SvelteKit 并非最受欢迎的 JavaScript 框架,但它却是广受好评的框架之一。

开发者倾向于使用 TypeScript,主要因为他们发现强类型降低了错误的发生率,并提升了编码过程中的体验,如代码自动补全和即时帮助等功能。然而,令人惊讶的是,主要做为 API 文档工具的 JSDoc,也可以进行类型检查。这项功能已直接内置在 Visual Studio Code 中,如 这篇文档 所述。开发者只需在 JavaScript 文件顶部加上:

// @ts-check

正如文档中的解释,“当无法推断出类型时,可以利用 JSDoc 注解进行明确说明”。这个特性实际上是由 TypeScript 提供支持,这意味着在实际环境下,TypeScript 和 JSDoc 是相辅相成的。

不过,一个易被忽视的细节是,Harris 主要是在针对库开发的上下文里关注 TypeScript。他认为切换到 JSDoc 在开发应用时,“可能收益不大”,他说道:“如果你在开发一个应用,无论怎样你都不可避免地需要一个构建步骤。你需要优化代码,需要代码压缩,需要打包各种资源。而如果你在构建一个库,我将极力推荐你使用 JSDoc。”

Harris 在 Hacker News 进一步 补充,“Svelte 的用户无需担心,这个变动不会影响到你与 Svelte 使用 TypeScript 的能力——从 Svelte 导出的函数仍然会有所有熟悉的 TypeScript 好处,如类型检查,智能感知,内联文档等”。他坚定地表示:“我们对 TypeScript 的承诺比以往任何时候都更为坚决。”

(题图:DA/e20ff1ee-6388-42ce-8d82-66bc6eebf63c)


via: https://devclass.com/2023/05/11/typescript-is-not-worth-it-for-developing-libraries-says-svelte-author-as-team-switches-to-javascript-and-jsdoc/

作者:Tim Anderson 译者:ChatGPT 校对:wxy

嗨!这周我一直在写一些 Javascript,和往常一样,当我开始一个新的前端项目时,我面临的问题是:我是否应该使用构建系统?

我想谈谈构建系统对我有什么吸引力,为什么我(通常)仍然不使用它们,以及一些前端 Javascript 库要求你使用构建系统时,为什么我觉得这让我感到沮丧。

我写这篇文章是因为我看到的大多数关于 JS 的文章都假定你正在使用构建系统,而对于像我这样的人来说,编写非常简单的、不需要构建系统的小型 Javascript 项目时,构建系统可能反而添加了很多麻烦。

什么是构建系统?

构建系统的思路是,你有一堆 Javascript 或 Typescript 代码,你想在把它放到你的网站上之前把它翻译成不同的 Javascript 代码。

构建系统可以做很多有用的事情,比如:

  • (出于效率的考虑)将 100 多个 JS 文件合并成一个大的捆绑文件
  • 将 Typescript 翻译成 Javascript
  • 对 Typescript 进行类型检查
  • 精简化
  • 添加 Polyfills 以支持旧的浏览器
  • 编译 JSX
  • 摇树优化 Tree Shaking (删除不使用的 JS 代码以减少文件大小)
  • 构建 CSS(像 tailwind 那样)
  • 可能还有很多其他重要的事情

正因为如此,如果你今天正在构建一个复杂的前端项目,你可能会使用 Webpack、Rollup、Esbuild、Parcel 或 Vite 等构建系统。

很多这些功能对我很有吸引力,我过去使用构建系统也是出于这样一些原因: 例如,Mess With DNS 使用 Esbuild 来翻译 Typescript,并将许多文件合并成一个大文件。

目标:轻松地对旧的小网站进行修改

我做了很多简单的小网站(之一之二之三之四),我对它们的维护精力大约为 0,而且我改变它们的频率很低。

我的目标是,如果我有一个 3、5 年前做的网站,我希望能在 20 分钟内,

  • 在一台新的电脑上从 GitHub 获取源代码
  • 做一些修改
  • 把它放到互联网上

但我对构建系统(不仅仅是 Javascript 构建系统!)的经验是,如果你有一个 5 年历史的网站,要重新构建这个网站会非常痛苦。

因为我的大多数网站都很小,所以使用构建系统的 优势 很小 —— 我并不真的需要 Typescript 或 JSX。我只要有一个 400 行的 script.js 文件就可以了。

示例:尝试构建 SQL 实验场

我的一个网站(SQL 试验场)使用了一个构建系统(它使用 Vue)。我最后一次编辑该项目是在 2 年前,是在另一台机器上。

让我们看看我今天是否还能在我的机器上轻松地构建它。首先,我们要运行 npm install。下面是我得到的输出:

$ npm install
[lots of output redacted]
npm ERR! code 1
npm ERR! path /Users/bork/work/sql-playground.wizardzines.com/node_modules/grpc
npm ERR! command failed
npm ERR! command sh /var/folders/3z/g3qrs9s96mg6r4dmzryjn3mm0000gn/T/install-b52c96ad.sh
npm ERR! CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/surface/init.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/avl/avl.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/backoff/backoff.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channel_args.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channel_stack.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channel_stack_builder.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channel_trace.o
npm ERR!   CXX(target) Release/obj.target/grpc/deps/grpc/src/core/lib/channel/channelz.o

在构建 grpc 时出现了某种错误。没问题。反正我也不需要这个依赖关系,所以我可以花 5 分钟把它拆下来重建。现在我可以 npm install 了,一切正常。

现在让我们试着构建这个项目:

$ npm run build
  ?  Building for production...Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:130:10)
    at module.exports (/Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/NormalModule.js:414:16)
    at handleParseError (/Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/NormalModule.js:467:10)
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/NormalModule.js:499:5
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/webpack/lib/NormalModule.js:356:12
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:373:3
    at iterateNormalLoaders (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
    at iterateNormalLoaders (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:236:3
    at runSyncOrAsync (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:130:11)
    at iterateNormalLoaders (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:232:2)
    at Array.<anonymous> (/Users/bork/work/sql-playground.wizardzines.com/node_modules/loader-runner/lib/LoaderRunner.js:205:4)
    at Storage.finished (/Users/bork/work/sql-playground.wizardzines.com/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:43:16)
    at /Users/bork/work/sql-playground.wizardzines.com/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:79:9

这个 Stack Overflow 的答案 建议运行 export NODE_OPTIONS=--openssl-legacy-provider 来解决这个错误。

这很有效,最后我得以 npm run build 来构建这个项目。

这其实并不坏(我只需要删除一个依赖关系和传递一个略显神秘的 Node 选项!),但我宁愿不被那些构建错误破坏。

对我来说,对于小项目来说,构建系统并不值得

对我来说,一个复杂的 Javascript 构建系统对于 500 行的小项目来说似乎并不值得 —— 它意味着放弃了在未来能够轻松更新项目的能力,以换取一些相当微小的好处。

Esbuild 似乎更稳定一些

我想为 Esbuild 大声叫好: 我 在 2021 年了解到 Esbuild,并用于一个项目,到目前为止,它确实是一种更可靠的构建 JS 项目的方式。

我刚刚尝试在一台新电脑上构建一个我最后一次改动在 8 个月前的 Esbuild 项目,结果成功了。但我不能肯定的说,两年后我是否还能轻松的建立那个项目。也许会的,我希望如此!

不使用构建系统通常是很容易的

下面是 Nginx 实验场 代码中导入所有库的部分的样子:

<script src="js/vue.global.prod.js"></script>
<script src="codemirror-5.63.0/lib/codemirror.js"></script>
<script src="codemirror-5.63.0/mode/nginx/nginx.js"></script>
<script src="codemirror-5.63.0/mode/shell/shell.js"></script>
<script src="codemirror-5.63.0/mode/javascript/javascript.js"></script>
<link rel="stylesheet" href="codemirror-5.63.0/lib/codemirror.css">
<script src="script.js "></script>

这个项目也在使用 Vue,但它只是用 <script src 来加载 Vue —— 前端没有构建过程。

一个使用 Vue 的无构建系统模板

有几个人问如何在没有构建系统的情况下开始编写 Javascript。当然,如果你想的话,你可以写原味的 JS,但我常用的框架是 Vue 3。

这是我做的一个小模板,用于启动一个没有构建系统的 Vue 3 项目。它只有 2 个文件和大约 30 行的 HTML/JS。

有些库需要你使用构建系统

构建系统这些事情最近盘旋在我的脑海里,因为这周我正在用 CodeMirror 5 做一个新项目,我看到有一个新版本,CodeMirror 6。

所以我想 —— 很酷,也许我应该使用 CodeMirror 6 而不是 CodeMirror 5。但是 —— 似乎没有构建系统你就不能使用 CodeMirror 6(根据 迁移指南),所以我打算坚持使用 CodeMirror 5。

同样地,你以前可以把 Tailwind 作为一个巨大的 CSS 文件下载,但是 Tailwind 3 似乎根本不能作为一个大的 CSS 文件使用,你需要运行 Javascript 来构建它。所以我现在要继续使用 Tailwind 2。(我知道,我知道,你不应该使用大的 CSS 文件,但是它验收只有 300KB,而且我真的不希望有构建步骤)

(更正:看起来 Tailwind 在 2021 年发布了一个 独立的命令行工具,这似乎是一个不错的选择)

我不完全确定为什么有些库不提供无构建系统版本 —— 也许发布无构建系统版本会给库增加很多额外的复杂性,而维护者认为这不值得。或者,库的设计意味着由于某种原因,不可能发布无构建系统版本。

我希望有更多的无构建系统的 Javascript 技巧

到目前为止,我的主要策略是:

  • 在某个库的网站上搜索 “CDN”,找到一个单独的 Javascript 文件
  • 使用 https://unpkg.com 来查看该库是否有一个我可以使用的内置版本
  • 托管我自己的库的版本,而不是依赖可能崩溃的 CDN
  • 编写我自己的简单集成方案,而不是拉入另一个依赖关系(例如,前几天我为 Vue 编写了自己的 CodeMirror 组件)。
  • 如果我想要一个构建系统,就使用 Esbuild

还有一些看起来很有趣但我还没有研究过的东西:


via: https://jvns.ca/blog/2023/02/16/writing-javascript-without-a-build-system/

作者:Julia Evans 选题:lkxed 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

JavaScript 比 Java 和 .NET 缺陷更少,修复更快

对数百万个商业应用程序的研究显示,近 75% 的应用程序存在安全缺陷,并随着时间的增长而变得不那么安全。其中,82.2% 的.NET 应用程序存在缺陷,而 Java 的缺陷为 77.7%,JavaScript的缺陷为 55.8%。只有 9.5% 的 JavaScript 应用程序存在较严重的安全漏洞,而 Java 和 .NET 的比例分别为 19.9% 和 21.9%。此外,JavaScript 缺陷的修复速度也更快,其一半的缺陷平均在 116天内修复,而 .NET 为 158 天,Java 为 243 天。

消息来源:Dev Class
老王点评:这个结果有点出乎意料,专门为企业应用而设计的 Java 和 .NET 反而不如 JavaScript。

微软通过补丁检查过期的 Office 套件

微软打算通过更新推送一个补丁,来了解知道在 Windows PC 上安装了多少个超出支持范围的 Office 应用副本。该补丁主要检查的是已经停止支持的 Office 2007 和 2010,也包括今年 4 月将停止支持的 Office 2013。微软称,“这个更新将默默地运行一次,不会在用户的设备上安装任何东西”。微软没有提到它打算如何处理从更新中收集的数据。

消息来源:The Register
老王点评:微软这手未免伸的有的过长了,难道支持过期的 Office 就不能用了么?

Linux 基金会发起新的“开放元宇宙基金会”

Linux 基金会称,开放元宇宙基金会(OMF)的使命是培养一个由开发者、工程师、学者和思想领袖组成的强大社区,希望联合各行业,“致力于开发开源软件和标准,以建立一个包容的、全球性的、供应商中立的、可扩展的元宇宙”。他们认为元宇宙“可以在数字空间创造新的就业机会和产业。它可以弥合物理世界和数字世界之间的差距,同时提供一个任何人都可以创造自己机会的奇妙世界。……所有这些的未来市场价值可能超过任何单一的媒体市场。”

消息来源:Linux 基金会
老王点评:我倒是觉得成立这个开放元宇宙基金会有的太早了。

一个名为 GNU LibreJS 的 Firefox 浏览器扩展程序旨在自动阻止非自由软件的大型 JavaScript 脚本。与 NoScript 相比,GNU LibreJS 的操作也类似。主要的区别特征之一是 NoScript 在默认情况下会阻止大多数 JavaScript 脚本,而 GNU LibreJS 针对的非自由软件的大型 JavaScript 脚本。

GNU LibreJS 源于 Richard Stallman 的一篇名为《JavaScript 陷阱》的文章。Stallman 认为,运行在浏览器上的非自由软件,主要是用 JavaScript 编写的,也有用其他语言编写的。这些应用程序有许多是专有软件或者不开源的,更有甚者其中不乏一些有害的或有问题的程序。Stallman 声称 Google 文档使用的 JavaScript 程序的大小为半兆字节。它是压缩过的,想要理解和分析这样的程序就很具有挑战性。Stallman 将监控用户的 JavaScript 代码称为恶意软件。

Stallman 建议不要运行那些复杂的或非常消耗处理能力的 JavaScript。从外部页面加载的脚本、修改 DOM 的脚本以及对 eval 的调用,都是符合上面描述的 JavaScript 代码的例子。GNU 网站发布了一个(符合上述描述的)列表。当 GNU LibreJS 安装在 Firefox 和其他兼容的浏览器中时,它会为用户做出这些区分。它会启用那些小型的 JavaScript,并阻止它认为非自由软件的大型 JavaScript 代码。

该扩展添加了一个工具栏图标,指示页面上存在多少被阻止的 JavaScript 引用。除了更改整个网站或特定脚本或代码段状态的控件外,单击会显示接受和阻止的 JavaScript。可以将整个网站以及特定脚本或代码片段列入白名单或黑名单。扩展程序会记住之前的设置。提供了显示 JavaScript 代码的选项,以及撤销所有自定义设置或单个自定义设置的选项。


via: https://www.opensourceforu.com/2022/09/gnu-librejs-for-firefox-stops-non-free-non-trivial-javascript/

作者:Laveesh Kocher 选题:lkxed 译者:littlebirdnest 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Node.js 创始人敦促甲骨文捐献 JavaScript 商标

Node.js 的创始人给甲骨文写了一封公开信,称 JavaScript 商标“是笼罩在世界最流行的编程语言上的一片乌云”。甲骨文公司在 2010 年收购昇阳公司时获得了 JavaScript、Java、MySQL 等商标。原则上,这意味着只有甲骨文公司可以允许一种语言被称为 JavaScript,以至于 JavaScript 的语言标准都只能称之为 ECMAScript。也有人曾经因为在 App 名称中使用了 JavaScript 而被下架。他称,甲骨文公司(几乎)“没有任何使用该商标的产品”,因而“JavaScript 商标侵权似乎很可能在法庭上无法执行”。他建议甲骨文公司捐献不用的 JavaScript 商标而获得商誉。

消息来源:Tiny Clouds
老王点评:我觉得这是与虎谋皮,与其指望甲骨文发善心捐献商标,倒不如所有 JavaScript 利益相关者考虑重新起个名字好,我觉得 JScript 就不错,就是不知道微软会怎么想。

苹果公司计划将其数字广告业务人员增加一倍

自从苹果去年推出了隐私规则,Facebook、Snap 和 Twitter 等已经损失了数十亿美元的广告收入,而市场估值的损失远超此数。与此同时,苹果广告平台团队拥有约 250 人,正在寻找另外 216 个这样的角色,几乎是它在 2020 年底招聘的 56 人的四倍。而苹果的广告业务已经从 2010 年代末的几亿美元收入上升到今年的约 50 亿美元,预计苹果将在四年内拥有 300 亿美元的广告业务。

消息来源:Slashdot
老王点评:所谓的用户隐私,背后都是生意啊。

微软再次提醒即将禁用基本认证方式

“基本认证”是一种古老的认证方法,通过向系统发送纯文本的密码来认证身份,由于其设计,对多因子认证的支持很不方便,因而被视为一种典型的安全缺陷。三年前,微软宣布它将开始使其软件产品摆脱基本认证,转而采用更现代、更安全的用户认证方法。在过去三年中,数百万用户已经远离了基本认证。现在,微软再次通知用户,10 月 1 日它将开始禁用 Exchange Online 各种协议中中尚未关闭的基本认证方式。

消息来源:The Register
老王点评:这种历史遗留下来的明文协议,确实需要抛弃了,但是依旧有大量陈旧的系统、老旧的用户就是懒得改。

韦伯太空望远镜大量使用了 20 年前的一种 JavaScript 方言

根据韦伯太空望远镜的综合科学仪器模块手册,它有一堆预先写好的 JavaScript 脚本来完成特定的任务,地面上的科学家可以告诉它运行这些任务。当然,这些脚本不是运行在一个浏览器里面,而是用一个叫做“脚本处理器”的程序解释,然后它将根据脚本的要求,与其他的应用程序和系统联系。这些脚本所使用的语言是一种 JavaScript 版本 Nombas ScriptEase 5.00e,但开发它的公司已不存在,这种语言最后的版本发布于 2003 年。虽然韦伯太空望远镜是在 2021 年底发射的,但这个项目从上世纪八十年代就开始了,而建设在 2004 年开始时的。

消息来源:The Verge
老王点评:居然选择了这么古老而不严谨的脚本,这十年间就难道没有一点点改进的想法吗?

VFX 参考平台建议动画行业升级到 RHEL 9

VFX 参考平台旨在帮助规范数字内容创作领域的软件平台,以发布年度软件建议清单而闻名,如每个操作系统上的编译器版本,特定年份的 Qt/Python/Numpy 组件,以及基于行业反馈和与各种内容创作者和工作室互动的各种其他软件版本。他们发布了一份报告,供视觉效果和动画工作室在选择下一个 Linux 平台时考虑。他们发现很多工作室仍然依赖 CentOS 7,他们建议这些工作室不迟于 2024 年转移到新的操作系统,首选是红帽的 RHEL 9,或者 Rocky Linux、AlmaLinux 等下游分支。他们也建议可以考虑 Ubuntu Linux。

消息来源:Phoronix
老王点评:即便不想付费购买 RHEL 9,Rocky Linux 等也可以考虑。其实,根据我的研究, CentOS Stream 也是可以的。

Meta 用算法“随机”解雇 60 名劳务派遣人员

此前 Meta 与埃森哲签订了近 5 亿美元的合同,由隶属于后者的劳务派遣人员到 Meta 位于奥斯汀的办公室工作,主要开展内容审核和商业诚信等业务。Meta 通过视频电话会议告知被裁的员工,除了明确是“随机”选择之外,没有给出裁员的具体原因。去年 8 月份,游戏行业支付处理公司 Xsolla 也使用算法裁掉了 150 名员工。

消息来源:纽约邮报
老王点评:很多底层员工,在他们看起来,其实就是一个数字,可以掷骰子决定。