NodeJS 12 语法错误: 意外的标记 'export'

3

我想做什么

我想使用库videojs-abloop

我的Node.js版本是v12.18.3

问题是什么

首先,我按照videojs-abloop的要求安装了两个库:

npm install video.js videojs-abloop

接着运行该命令

$ node --experimental-modules index.js

错误输出
$ node --experimental-modules index.js
(node:31057) ExperimentalWarning: The ESM module loader is experimental.
/my_path/testimport/node_modules/videojs-abloop/videojs-abloop.js:8
export default function (window, videojs) {
^^^^^^

SyntaxError: Unexpected token 'export'

我的项目结构是什么

我有两个文件:index.jspackage.json

index.js

import videojs from 'video.js'
import abLoopPlugin from 'videojs-abloop'

abLoopPlugin(window,videojs);

package.json

{ "type": "module" }

我已经检查了什么

我查看了有关ESM导入的信息,但是Node.js 12:ESM导入,但我认为这与这个问题无关。


尝试将您的文件重命名为 index.mjs - Phil
看这个 https://dev59.com/AFcO5IYBdhLWcg3waw6o 。如果你真的想使用es6的import/export和所有es6和next的功能,尝试使用typescript,或者按照这个 https://www.freecodecamp.org/news/how-to-enable-es6-and-beyond-syntax-with-node-and-express-68d3e11fe1ab/。 - Saroj
@Phil:显然这不会改变任何事情,因为错误在第三方NPM包中,而不是OP的代码中,因此代码无法更改其代码中的任何内容,也不会产生任何影响。 - Jörg W Mittag
@Saroj:错误出现在第三方 NPM 包中,而不是 OP 的代码中。OP 可以阅读所有的教程,但他们自己的代码中无论做出什么改变都无法解决这个问题。 - Jörg W Mittag
错误出现在第三方的NPM包中 - 错误是我的!应该已经在v.1.2.0中修复了,请参见下面的答案。 - phhu
显示剩余2条评论
2个回答

4

仅凭文件外观无法确定它是ECMAScript脚本还是ECMAScript模块。因此,您需要告诉引擎其中之一。

在Web上,这通过不同的MIME类型解决,但是文件系统上不存在MIME类型,因此Node.js使用文件扩展名(.mjs)或package.json中的type字段("type": "module")来区分两者。

正如文档所述[注:我引用的是最新文档,但唯一的区别是是否默认启用ESM]:

启用

实验性支持 ECMAScript 模块已默认启用。当以下文件作为初始输入传递给 Node.js,或在 ES 模块代码中的 import 语句引用时,Node.js 将其视为 ES 模块:

  • .mjs 结尾的文件。
  • .js 结尾的文件,但其最近的父级 package.json 文件包含顶级字段 "type",且该字段的值为 "module"
  • 作为参数传递给 --eval 或通过 STDIN 管道传递给 node 的字符串,并使用标志 --input-type=module

有关 Node.js 如何确定文件是 ECMAScript 脚本还是 ECMAScript 模块的详细信息,请参阅其他几个页面。

您似乎使用的是过时或错误的版本的videojs-abloop。根据GitHub Issues,尤其是this commitvideojs-abloop被编写为ECMAScript模块,但被转译为ECMAScript脚本。在您的情况下,由于某种原因,您拥有videojs-abloop的ECMAScript模块而不是ECMAScript脚本。


谢谢您的澄清。我明白了。对于那些可能需要理解模块和脚本之间差异的人(就像在阅读此文之前的我一样):https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules - yuntres
顺便提一下,我已经更新了 videojs-abloop 的版本,但它仍然是一个 Module(函数定义为 export default function ...)。 - yuntres
"type": "module" 每次都让我困扰! - Metro Smurf

0

我已经发布了 videojs-abloop 的更新(版本 1.2.0),它回退到使用 Common JS 导出插件。这似乎可以工作,可以使用 require 导入模块,或者使用 "type":"module"--experimental-modules 设置并使用 import

我使用了您的代码重新创建了您的问题,然后应用了更新,问题就消失了。

请升级到 v1.2.0 并告诉我它是否有效(通过 https://github.com/phhu/videojs-abloop/issues 报告问题)

感谢您发布问题,并为疏忽道歉!

要手动进行更改,只需将 node_modules/videojs-ablooop/videojs-abloop.js 的第一行非注释行更改为

module.exports = function (window, videojs) {


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接