在咖啡脚本中使用 es6 模块

Posted

技术标签:

【中文标题】在咖啡脚本中使用 es6 模块【英文标题】:Using es6 modules in coffeescript 【发布时间】:2021-08-17 22:41:57 【问题描述】:

es6 模块应该在coffeescript 中工作(参见https://coffeescript.org/#modules),但即使是一个非常简单的项目,它也不适合我。我:

    新建目录

    在其中运行“npm init -y”

    在我的 package.json 中添加了键“type”:“module”

    创建了 2 个文件:index.coffee 和 utils.coffee

    从“utils.coffee”导入 myprint myprint("你好,世界!")

    导出 myprint = (str) -> 控制台.log(str)

当我尝试执行 index.coffee(通过 'coffee index.coffee' - 我已经尝试过 git 的 bash shell - 在 Windows 和 PowerShell 上)时,我收到以下错误消息:

(node:1856) 警告:要加载 ES 模块,请在 package.json 中设置 "type": "module" 或使用 .mjs 扩展名。

及以后:

SyntaxError: 不能在模块外使用 import 语句

【问题讨论】:

【参考方案1】:

据我所知,这都是正确的。 Coffeescript 正确地转译了导入/导出语句,但没有提供运行它们的环境。

来自documentation:

请注意,CoffeeScript 编译器不解析模块;在 CoffeeScript 中编写导入或导出语句将在结果输出中生成导入或导出语句。您有责任将此 ES2015 语法转换为可在您的目标运行时运行的代码。

您将无法通过coffeenode --require coffeescript/register 运行此代码。我相信您将不得不转译您的代码并通过node运行生成的JS

【讨论】:

我知道错误实际上来自节点,而不是咖啡。但是,不需要进行转译,因为我已经将节点设置为本机识别 es6 模块。我认为以这种方式使用咖啡脚本的人可能知道答案,但可能需要熟悉节点的人来解释为什么这在它应该不起作用的时候不起作用。这就是为什么我在这个问题中添加了关键字“node.js”。 Node 知道 esm,但它不知道在作为 esm 加载时如何处理 coffeescript 文件。您需要一些东西来即时转换通过import 加载的每个咖啡文件。这里有一组咖啡脚本加载器,可能是您需要的:github.com/GeoffreyBooth/node-loaders/tree/master/… 如果我理解正确的话,问题是在我的主文件上运行咖啡时,它会找到“import X from 'Y.coffee',它只是复制到输出 javascript (只附加一个分号),但是当节点尝试执行它时,它不知道如何导入咖啡模块。有道理。 但是:1) 这并不能解释为什么当我的 package.json 中有 "type": "module" 时节点抱怨我在模块外部使用了 'import' -除非 .coffee 扩展名导致它忽略该设置(但它应该只是抱怨它不理解 .coffee 文件),并且 2)您推荐的节点加载器的文档非常少 - 甚至没有如何使用它.我会试着弄清楚,但我认为这需要一些时间。 我通常将“transpile”这个词解释为仅仅意味着将 es6 JavaScript 文件更改为 pre-es6 JavaScript 文件。但是这里需要安排将coffeescript文件转换为JavaScript文件(可以是es6,因为node现在可以处理)。我猜这就是 node-loaders 的作用,但不幸的是,我不知道如何使用它。我会尝试谷歌搜索;-)

以上是关于在咖啡脚本中使用 es6 模块的主要内容,如果未能解决你的问题,请参考以下文章

您如何在 Rails 3.1 中使用 Sprockets 编写干燥的模块化咖啡脚本?

找不到模块'咖啡脚本'

前端自动化 shell 脚本命令 与 shell-node 脚本命令 简单使用 之 es6 转译

在没有咖啡脚本的 Rails 3.2 中使用 javascript

在 onclick 属性中使用咖啡脚本创建函数 [重复]

是否可以在咖啡脚本评论中添加哈希