For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/proposal-import-text.md.
  • 简体中文
  • Import Text S3

    中文标题:导入文本

    提案概览
    提案速览

    该提案为type导入属性引入了一个新的'text'值,允许将文件作为字符串导入,类似于现有的JSON导入。它解决了Fetch API的局限性,如异步操作和基本URL解析问题。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    导入文本

    与导入JSON原始字节在JavaScript中有用的方式类似,导入文本同样有用,并且应该同样简单。

    这将使用户受益,因为一个相对常见的操作可以同时变得更简单和更高效,从而带来更好的Web体验。

    例如,一个开发者可能想要导入一个YAML文件并使用用户库解析它。

    处理和评估解决方案的方法

    正如在站点构建人体工程学的上下文中提到的, "使某事更容易的最强大方式是使其更简单,因此我们的目标是通过减少作者为实现他们期望的结果而需要处理的总体复杂性。" 因此,我们应该寻求推进一种简化开发者体验的解决方案。

    此外,正如在使用JavaScript扩展Web下所述, "我们认为浏览器应该从有效的实践中学习,倾听需求,并提供正确的原语。随着生态系统中出现基本特性和抽象,我们可以将它们标准化并直接集成到Web平台中,以使事情更简单。"在可能的情况下,我们提出的标准化解决方案不应该是新颖的,而应该是那些已被证明运行良好,并与先前解决方案良好集成的解决方案。

    先前/现有的特性和提案

    使用Fetch API,可以在JavaScript中加载文本文件:

    let response = await fetch("path/to/file.txt");
    let text = await response.text();

    使用导入属性,我们已经支持导入JSON模块(规范MDN):

    import json from "path/to/file.json" with { type: "json" };

    另一个独立的导入字节TC39提案已经相当迅速地推进到2.7阶段,并且很可能很快进一步推进。有了它,也可以导入文本,例如:

    import uint8array from "path/to/file.txt" with { type: "bytes" };
    let text = new TextDecoder().decode(uint8array);

    一些服务器端JavaScript实现,包括至少DenoBun,也支持type: "text"作为导入属性:

    import text from "path/to/file.txt" with { type: "text" };

    现有特性/提案的缺陷或限制

    虽然现有的Fetch API有效,但它有三个明显的限制:

    1. 操作总是异步的。
    2. 相对路径以文档的基本URL为根,而不是以从中获取的模块的基本URL为根。
    3. 提取仅在JavaScript执行时开始。

    如果导入字节提案继续推进而本提案不推进,导入文本文件将需要额外且笨拙的步骤。

    本提案的动机

    在JavaScript中加载文本文件应该很容易,并且可以在不向语言添加新复杂性的情况下完成。现有功能(加载JSON文件)实际上已经在内部要求本提案所描述的功能。

    提议解决方案的概要

    type导入属性添加一个新的'text'值,使用该值可以将文件作为字符串值导入:

    import text from "path/to/file.txt" with { type: "text" };

    不应提供定义编码的方式。

    缺点

    在JavaScript中以编码方式导入文本将需要将其导入为Uint8Array,并显式解码:

    import uint8array from "path/to/file.txt" with { type: "bytes" };
    let text = new TextDecoder("utf-16le").decode(uint8array);