javascript - SyntaxError:无法在模块外部使用导入语句(来自依赖项)
问题描述
当依赖项未声明为模块时,如何从依赖项中解决“无法在模块外使用 import 语句”?
我想使用Svelte/kit 中的验证器来验证电子邮件。但是,在导入 ESM 版本时,我收到“无法在模块外使用 import 语句”错误。我正在使用 pnpm 而不是 npm 或纱线。
import isEmail from 'validator/es/lib/isEmail'
/node_modules/.pnpm/validator@13.6.0/node_modules/validator/es/lib/isEmail.js:1
import assertString from './util/assertString';
^^^^^^
SyntaxError: Cannot use import statement outside a module
at Object.compileFunction (node:vm:355:18)
at wrapSafe (node:internal/modules/cjs/loader:1039:15)
at Module._compile (node:internal/modules/cjs/loader:1073:27)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1138:10)
at Module.load (node:internal/modules/cjs/loader:989:32)
at Function.Module._load (node:internal/modules/cjs/loader:829:14)
at Module.require (node:internal/modules/cjs/loader:1013:19)
at require (node:internal/modules/cjs/helpers:93:18)
at nodeRequire
看来验证器正在尝试使用 import 语句,但它的 package.json 没有指定"type": "module"
. 我的猜测是这是错误的根本原因。
调试步骤
- package.json 有
"type": "module"
- 升级到最新版本的节点
- 尝试使用非 esm 版本的验证器
'validator/lib/isEmail'
,但这会导致与此线程无关的其他错误。
有关的
- SyntaxError: Cannot use import statement outside a module - 此解决方案适用于您控制的代码,而不适用于依赖项
- 导入 ECMAScript 6 时出现“未捕获的语法错误:无法在模块外使用 import 语句” ——这似乎非常相似,但我在节点中收到此错误,而不是在浏览器中
元数据
- 节点:v16.2.0
- Sveltekit:v1.0.0-next.115
- 验证者:13.6.0
解决方案
你试过这样导入吗?
import validator from 'validator'
我尝试使用最新的 SvelteKit 重现您的问题。这工作正常:
// index.svelte
<script>
import validator from 'validator';
let result = validator.isEmail('foo@bar.com');
console.log(result);
</script>
当我将导入语句更改为:
import validator from 'validator/es/lib/isEmail'
我从你的问题中得到了错误(不能在模块外使用 import 语句)。
导入validator/es/lib/isEmail
据说只导入库的一个子集。我不确定它会有多大的不同。它可能没有任何区别。稍大的构建击败了不起作用的构建。我建议先让它工作,然后如果你真的需要优化构建大小。
推荐阅读
- vba - PowerPoint 2016 和 PowerPoint 360 VBA 宏之间的错误
- c - 在 Arduino 中转换有符号/无符号整数变量的问题
- javascript - 使用字符开始和结束位置的多个唯一字符串替换
- bash - 将密码短语添加到环境变量 (bashrc) 以便在重新启动 Apache 服务器时使用
- azureservicebus - 是否可以从 ServiceBus 主题中删除消息?
- pyspark - to_timestamp 何时产生 19xx 的结果?
- c# - 使用 Task.Run() 时如何限制最大线程数?
- python - 如何为 pandas read_html 设置代理?
- r - 在单轴 ordiplot 图上操作大小
- reactjs - 为什么 Material-UI Textfield 不能同时接受 type 和 maxlength?