ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Gleam v1.16.0 版本全解析:JavaScript Source Maps、常量列表扩展与 Hex 包管理增强

Gleam v1.16.0 版本全解析:JavaScript Source Maps、常量列表扩展与 Hex 包管理增强 Gleam v1.16.0 版本全解析JavaScript Source Maps、常量列表扩展与 Hex 包管理增强【免费下载链接】gleam⭐️ A friendly language for building type-safe, scalable systems!项目地址: https://gitcode.com/GitHub_Trending/gl/gleam本文基于仓库内 changelog/v1.16.md 版本记录整理。Gleam v1.16.0 于 2026-04-24 正式发布历经 rc1、rc2、rc3、rc4 四个候选版本迭代。这一版本围绕 JavaScript 目标构建体验、编译器诊断能力、Hex 包管理命令以及语言服务器代码动作进行了系统升级。阅读本文后你将掌握 v1.16 中 source maps 的开启与工作原理、常量中列表前置的新语法、gleam hex系列命令的新参数形态以及语言服务器新增的多种代码动作并了解每一处改进背后的源码实现依据。一、v1.16.0 发布概览与版本节奏v1.16.0 的演进沿四条主线展开编译器支持在常量中使用列表前置语法、一次报告所有相互独立模块中的错误、record update 分析容错、JavaScript 目标 52 位 int 段警告、Unicode 相似字符错误提示以及单字符字符串前缀匹配的性能优化。构建工具新增gleam hex owner add命令retire/unretire/transfer子命令全面改为 flag 参数gleam add错误消息更友好并支持mts/cts/jsx/tsx等原生文件扩展名。语言服务器新增匿名函数包装/消除、扩展 extract function 能力、类型通配符填充等多项代码动作。Formatter改进长嵌套元组的换行策略修复若干格式化边界问题。版本时间线如下依据 changelog 记录版本日期主要内容v1.16.0-rc12026-04-10编译器与构建工具大批新特性source maps、列表前置、hex owner add 等v1.16.0-rc22026-04-14新增原生文件扩展名、manifest 解析即时报错、use 表达式代码动作修复v1.16.0-rc32026-04-20新包要求gleam_stdlib 1.0.0、互递归函数类型检查修复v1.16.0-rc42026-04-22source maps 完善复制源码文件、sources 改为相对 URLv1.16.02026-04-24正式发布二、重点新特性JavaScript 目标 Source Mapssource maps 是 v1.16 最具分量的新特性让面向 JavaScript 的编译产物可以在浏览器中直接调试原始 Gleam 源码。1. 如何在gleam.toml中开启在项目的gleam.toml中于[javascript]段设置source_maps true即可开启默认关闭[javascript] typescript_declarations true source_maps true runtime node以上完整配置形态可在 compiler-core/src/config.rs 的包配置示例中看到。从 config 快照 可见未设置时source_maps序列化结果为false即默认不生成 source maps。2. 源码级实现配置解析与构建指纹在 compiler-core/src/config.rs 中JavaScriptConfig结构体声明了source_maps: bool字段#[serde(default)]使其默认为falsepub struct JavaScriptConfig { #[serde(default)] pub typescript_declarations: bool, #[serde(default)] pub source_maps: bool, #[serde(default default_javascript_runtime)] pub runtime: Runtime, #[serde(default, rename deno)] pub deno: DenoConfig, }值得注意的是source maps 是否开启会进入构建指纹影响增量编译缓存的有效性。在 compiler-core/src/build/project_compiler.rs 中check_gleam_version_and_build_configuration将javascript.source_maps与typescript_declarations打包进构建配置指纹flags.set(0, js self.config.javascript.typescript_declarations); flags.set(1, js self.config.javascript.source_maps); let fingerprint format!({COMPILER_VERSION} {}, flags.bits);这意味着切换source_maps开关会触发构建目录重建避免旧缓存与新的产物生成配置混用。这从机制上保证了打开 source maps 后产物的正确性。在代码生成层面compiler-core/src/javascript/expression.rs 中ExpressionGenerator持有可选的source_map_builder基于sourcemap::SourceMapBuilder在生成每个表达式、函数定义、变量绑定时通过source_map_tracker记录 Gleam 源码位置与生成代码位置的对应关系最终产出标准 source map 文件。3. rc4 完善复制源码文件与相对 sources 路径v1.16.0-rc4 对 source maps 做了两项关键完善复制 Gleam 源码到输出目录开启 source map 生成后编译器会将源 Gleam 文件一并复制到输出目录这样 source maps 在浏览器中直接可用无需额外处理后即可被 DevTools 加载。sources属性改用相对 URL此前 source map 文件的sources属性使用文件系统绝对路径这在部分 JavaScript 环境中无法正确解析现在改为指向源文件的相对 URL保证跨环境可用。4. 测试验证仓库内 compiler-core/src/javascript/tests/sourcemaps.rs 通过assert_source_map!宏对 source map 生成做了系统测试覆盖函数定义含未使用函数、变量赋值、字符串换行转义、自定义类型定义等多种场景验证了 source map 内容与预期快照一致。三、编译器改进1. 常量中的列表前置List Prependv1.16 支持在常量中使用列表前置语法将新元素拼接到既有常量列表头部pub const viviparous_mammals [dog, cat, human] pub const all_mammals [platypus, echidna, ..viviparous_mammals]此前该语法仅可用于普通表达式现在常量同样支持。从 Erlang 目标测试 与 JavaScript 目标测试 可以看到两个后端均有对应的list_prepend测试用例含同模块与跨模块引用常量两种形态确保前置拼接在编译期即可求值并在两个目标上生成正确代码。2. 一次报告所有独立模块的错误此前编译器遇到第一个有错误的模块就会停止报告v1.16 起对于互不依赖的模块编译器会一次性报告全部错误和警告不再提前中断。这对大型多模块项目尤其有价值——一次编译即可看到所有需要修复的问题减少反复编译的循环次数。从实现路径看这属于 compiler-core/src/analyse.rs 及构建流程中模块分析顺序的改进。3. record update 分析容错与错误消息容错分析record update 表达式的分析现在是容错的遇到第一个无效字段后不再停止报告后续错误与多模块错误报告改进一脉相承目标是尽可能多地暴露问题。更清晰的错误消息当对没有带标签字段的变体使用 record update 语法时编译器会给出更有针对性的错误说明帮助开发者理解为什么该变体无法使用这种更新语法。4. deprecated 属性错误消息改进当deprecated属性缺少字符串消息时错误提示更明确。例如pub type HashAlgorithm { deprecated Md5 Sha224 Sha512 }现在会得到error: Syntax error ┌─ /src/parse/error.gleam:3:3 │ 3 │ deprecated │ ^^^^^^^^^^^ A deprecation attribute must have a string message.这要求每个deprecated属性都必须附带字符串说明如deprecated(Use Sha512 instead)在 compiler-core/src/type_/expression.rs 等处可看到Deprecation::Deprecated { message }在类型检查阶段对弃用消息的消费逻辑。5. JavaScript 目标52 位 int 段截断警告JavaScript 的number类型有效整数精度为 52 位因此当位数组BitArray的 int 段声明超过 52 位时编译器会在 JavaScript 目标上给出警告pub fn go(sha: BitArray) { let _, number:152 sha number }warning: Truncated bit array segment ┌─ /src/app/warning.gleam:3:20 │ 3 │ let _, number:152 sha │ ^^^ This segment is a 152-bit long int, but on the JavaScript target numbers have at most 52 bits. It would be truncated to its first 52 bits. Hint: Did you mean to use the bytes segment option?该警告明确提示截断行为并建议改用bytes段选项避免开发者跨目标移植时踩到精度丢失的坑。6. Unicode 相似字符错误提示当源码中出现与正确字符外观相似但实际不同的 Unicode 字符时编译器会给出这是形似字符的提示。例如把 ASCII 逗号误写成低单引号逗号U201A‚时error: Syntax error ┌─ /src/parse/error.gleam:1:20 │ 1 │ pub fn main() { #(1‚ 2) } │ ^ Unexpected character This looks like ascii comma, but it is actually the unicode low single comma quotation mark.这类提示对从文档、网页复制代码导致的隐形字符错误非常有效省去了逐字符排查的困扰。7. 单字符字符串前缀匹配性能优化JavaScript 目标上对单字符字符串前缀string.starts_with类操作的匹配生成了更高效的代码。changelog 记录中给出的数据表明glance包在 JavaScript 目标上的基准测试结果明显改善# before: min: 10.8ms, max: 365.82ms, median: 14.74ms, mean: 14.76ms # after: min: 8.96ms, max: 143.76ms, median: 10.72ms, mean: 11.06mschangelog 将其表述为几乎快 30%以 median 计约提升 27%。这是模式匹配代码生成层面的优化相关决策逻辑可在 compiler-core/src/javascript/decision.rs 中追踪。四、构建工具与 Hex 包管理增强1.gleam hex owner add为包添加所有者新增命令gleam hex owner add允许为已发布的包添加协作所有者gleam hex owner add --package my_package --user alice --level maintainer从 compiler-cli/src/lib.rs 的 CLI 定义可以看到完整参数Add { #[arg(long)] package: String, /// The username or email of the additional owner #[arg(long user)] username_or_email: String, /// The ownership level #[arg(long, default_value maintainer)] level: hexpm::OwnerLevel, }--package包名--user新增所有者的用户名或邮箱--level所有权级别默认maintainer可通过hexpm::OwnerLevel类型扩展其他级别。该命令通过HEXPM_API_KEY环境变量可选向 Hex 认证。命令执行时会打印Adding owner/Added owner的进度提示见 compiler-cli/src/cli.rs。2. retire / unretire / transfer 命令全面改为 flag 参数v1.16 统一了gleam hex子命令的参数风格废弃位置参数gleam hex retire现在接受三个 flag--package、--version、--reasongleam hex unretire接受--package与--version两个 flaggleam hex owner transfer接受--packageflag 而非位置参数。这一改动与所有带变体的选项使用一致的取值表示的目标呼应使命令更清晰、更易被脚本化调用。3.gleam add的友好错误消息当添加的版本范围不存在时错误消息给出明确范围说明。例如运行gleam add wisp11error: Dependency resolution failed The package wisp has no versions in the range 11.0.0 and 12.0.0.此前这类错误难以定位现在直接展示解析失败的版本范围对应的依赖解析逻辑位于 compiler-core/src/dependency.rs。4. 缺失模块的创建建议当代码引用了缺失的模块时构建工具会根据上下文给出创建建议若缺失模块是 dev 模块在dev/目录或测试模块在test/目录提示会分别建议在该目录创建文件减少猜测。5. 新增原生文件扩展名支持rc2 起mts、cts、jsx、tsx被加入原生文件扩展名集合意味着你可以在外部 JavaScript 代码中使用这些扩展名的文件例如带 JSX 语法的模块或 TypeScript 模块作为 FFI 模块。相关处理位于 compiler-core/src/build/native_file_copier.rs 及其测试 native_file_copier/tests.rs。6.gleam_stdlib版本要求提升rc1新生成的 Gleam 包要求 0.70.0的gleam_stdlibrc3要求提升为 1.0.0。这是gleam new模板的默认依赖约束变化确保新项目建立在 stdlib 1.x 的稳定语义之上。7.gleam docs build缓存优化gleam docs build不再每次运行都重新编译项目全部依赖显著加快文档迭代速度。此外gleam publish命令补齐了自身选项的文档说明--target选项的帮助文本也补充了更多细节。8. 其他构建工具改进Hex 拒绝发布HTTP 422时显示实际错误消息而不是一律回退到默认的 can only modify a release up to one hour after publication发布时提示与错误消息改用完整术语 MFA不再使用简写gleam.toml中出现无效依赖名时解析阶段立即报错rc2不再等到使用阶段才暴露新包模板在 rc1 阶段即默认要求 0.70.0的 stdlib后提升至 1.0.0。五、语言服务器更智能的代码动作1. 匿名函数包装与消除语言服务器新增两个互逆的代码动作Wrap in anonymous function将函数引用包装成匿名函数Remove anonymous function删除冗余的匿名函数外壳直接暴露其函数引用。例如在光标处触发 Remove anonymous functionpub fn main() { [-1, -2, -3] | list.map(fn(a) { int.absolute_value(a) }) // ^^ 在此处激活代码动作 }会得到pub fn main() { [-1, -2, -3] | list.map(int.absolute_value) }反向操作则恢复包装。2. extract function 能力扩展extract function 代码动作新增两种适用场景场景一提取管道中的连续步骤。选中管道中间的两步后pub fn words() { string | string.lowercase // ^^^ | string.replace(each: jak, with: lucy) // ^^^ 选中这两步 | string.split(on: ) }提取为pub fn words() { string | function | string.split(on: ) } fn function(string: String) - String { string | string.lowercase | string.replace(each: jak, with: lucy) }场景二提取赋值语句右侧表达式pub fn personal_blog() { let introduction html.main([], [ html.h1([], [html.text(Hello, world!)]), html.p([], [html.text(Gleam is cool)]) ]) //^^^ 在此触发 extract function html.body([introduction, blog_posts()]) }提取为独立函数pub fn personal_blog() { let introduction function() html.body([introduction, blog_posts()]) } pub fn function() { html.main([], [ html.h1([], [html.text(Hello, world!)]), html.p([], [html.text(Gleam is cool)]) ]) }此外此前 Extract function 在块内 use 语句上触发可能生成无效代码的 bug 也已在 v1.16 修复。3. extract variable 命名改进extract variable 代码动作在 case 分支和块中能选取更好的变量名忽略其他分支中不相关的变量名干扰减少提取后手动改名的需求。4. 类型通配符填充新增代码动作可将类型标注中的_替换为推断出的具体类型。例如在Result(_, Error)的_处触发pub fn load_user(id: Int) - Result(_, Error) { // ^ 在此触发 sql.find_by_id(id) | result.map_error(CannotLoadUser) }自动补全为pub fn load_user(id: Int) - Result(User, Error) { sql.find_by_id(id) | result.map_error(CannotLoadUser) }5. 补全与诊断改进编写 record update 时语言服务器现在会对记录的标签参数提供补全编辑限定类型qualified type时不再错误地补全值当打开的文件因其依赖编译失败而无法分析时语言服务器会显示诊断帮助定位根因修复了 Add missing type parameter 代码动作可能对不存在的类型而非类型变量触发的问题修复了 Add missing patterns 代码动作在补全不完整 case 表达式时误删注释的问题。六、Formatter 改进1. 长嵌套元组的换行策略此前格式化长嵌套元组时只拆分最后一个元组#(#(wibble, wobble), #(some_long_tuple, passed_as_last_argument)) // 旧行为 #(#(wibble, wobble), #( some_long_tuple, passed_as_last_argument ))v1.16 改为优先将每个元素拆到单独一行结构更均匀#(#(wibble, wobble), #(some_long_tuple, passed_as_last_argument)) // 新行为 #( #(wibble, wobble), #(some_long_tuple, passed_as_last_argument) )2. 其他格式化修复不再把类型标注中的注释移出类型标注修复了部分函数被格式化后超过 80 字符上限的问题修复了部分错误提示文本的换行hint 自动折行问题。七、Bug 修复汇总除上述改进外v1.16 还修复了分布在多个后端与工具链中的缺陷JavaScript 目标修复BitArray$BitArray$data构造DataView时字节长度错误的问题rc4 前rc1 版本遗留该 bug 导致切片位数组包含底层 buffer 的多余字节v1.15.1 曾修复 offset 版本v1.16 修复长度版本修复生成的 JavaScript 代码中管道缺少分号、特定场景下引发运行时错误的问题修复case表达式 subject 直接匹配某分支时内部变量可能生成重复let声明的问题修复位数组大小表达式中算术运算符不满足左结合的问题a - b - c此前被错误计算为a - (b - c)。Erlang 目标修复带utf16/utf32选项的位数组字符串段在 Erlang 目标上代码生成错误的问题。解析与类型检查修复包含大量互递归函数的无效程序可能通过类型检查的问题rc3修复manifest.toml中无效包名解析时未立即报错的问题rc2编译器现在能正确解析带字节序标记BOM的 UTF-8 源文件不再报错位数组 pattern 的 size 选项中引用的常量不再被误报为未使用修复读取包含大常量的模块缓存时编译器崩溃的问题。代码动作与文档修复 Wrap in anonymous function 代码动作可在use表达式体内触发的问题rc2修复 Add missing type parameter 与 Add missing patterns 代码动作的边界 bug见上文修复生成文档中代码块的框线绘制字符未与其余字符使用同一等宽字体的问题修复字段名含非 ASCII 字符除description外时无法发布包的问题。八、升级建议与小结Gleam v1.16.0 是围绕开发体验的一次集中交付面向JavaScript 部署的团队应重点关注source_maps true配置配置位置rc4 的源码复制与相对路径改进让浏览器直接调试 Gleam 源码成为开箱即用的体验面向Hex 发布的维护者gleam hex owner add与 retire/transfer 的 flag 化参数值得立即采用同时留意新项目模板对gleam_stdlib 1.0.0的要求日常编辑器用户能从匿名函数消除、extract function 管道提取、类型通配符填充等代码动作中直接受益常量中的列表前置语法测试证据则让编译期常量组合更灵活。建议升级后清理构建缓存编译器本身会在检测到 source maps 等配置变化时自动重建并在 CI 中及时更新快照测试以吸收格式化与错误消息的变更。完整的版本历史可继续查阅 CHANGELOG.md 与 changelog 目录下的各版本记录。【免费下载链接】gleam⭐️ A friendly language for building type-safe, scalable systems!项目地址: https://gitcode.com/GitHub_Trending/gl/gleam创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表