我正在尝试使用库videojs-abloop
我的nodejs版本是int snapshot1 = this.value;
Thread.interrupted();
int snapshot2 = this.value;
if (snapshot1 != snapshot2) throw new AssertionError();
首先,我按照videojs-abloop的要求安装了两个库:
v12.18.3
然后运行命令
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.js
:
index.js
package.json
package.json
import videojs from 'video.js'
import abLoopPlugin from 'videojs-abloop'
abLoopPlugin(window,videojs);
我检查了ESM导入,但检查了Node.js 12 : ESM Imports,但我认为这与该问题无关
答案 0 :(得分:0)
仅通过查看文件就无法确定它是ECMAScript脚本还是ECMAScript模块。因此,您需要告诉引擎这是两者中的哪一个。
在网络上,这是通过不同的MIME类型解决的,但是MIME类型在文件系统上不存在,因此Node.js使用文件扩展名(.mjs
)或{ {1}}(type
)来区分两者。
the documentation说的[注:我引用的是最新文档,但唯一的区别是ESM是否默认启用]:
启用
默认情况下启用对ECMAScript模块的实验支持。当传递给节点作为初始输入或被ES模块代码中的
package.json
语句引用时,Node.js将把以下内容视为ES模块:
- 以
"type": "module"
结尾的文件。- 当最近的父级
import
文件包含值为.mjs
的顶级字段.js
时,文件以package.json
结尾。- 作为参数传递给
"type"
的字符串,或者通过带有标志"module"
的{{1}}传递给节点的字符串。
关于Node.js如何准确确定文件是ECMAScript脚本还是ECMAScript模块,还有几页内容。
您似乎拥有--eval
的过时或损坏的版本。根据{{3}},尤其是GitHub Issues,STDIN
被编写为ECMAScript模块,但被转换为ECMAScript脚本。对于您而言,由于某种原因,您拥有一个ECMAScript模块,而不是--input-type=module
的ECMAScript脚本。
答案 1 :(得分: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) {