语法错误:不能在模块外使用 import 语句(来自依赖项)

Nic*_*ick 5 javascript node.js node-modules package.json npm-package

当依赖项未声明为模块时,如何从依赖项中解决“不能在模块外使用导入语句”?


我想用验证在斯维尔特/套件来验证电子邮件。但是,在导入 ESM 版本时,出现“无法在模块外使用导入语句”错误。我使用的是 pnpm 而不是 npm 或 yarn。

import isEmail from 'validator/es/lib/isEmail'
Run Code Online (Sandbox Code Playgroud)
/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 
Run Code Online (Sandbox Code Playgroud)

似乎验证器正在尝试使用 import 语句,但它的 package.json 没有指定"type": "module". 我的猜测是这是错误的根本原因。

调试步骤

  • package.json 有 "type": "module"
  • 升级到最新版本的节点
  • 尝试使用非 esm 版本的 validator 'validator/lib/isEmail',但这会导致与此线程无关的其他错误。

有关的

元数据

  • 节点:v16.2.0
  • Sveltekit:v1.0.0-next.115
  • 验证器:13.6.0

Lef*_*ium 5

您尝试过这样导入吗?

import validator from 'validator'
Run Code Online (Sandbox Code Playgroud)

我尝试使用最新的 SvelteKit 重现您的问题。这工作正常:

// index.svelte
<script>
    import validator from 'validator';
    let result = validator.isEmail('foo@bar.com');
    console.log(result);
</script>
Run Code Online (Sandbox Code Playgroud)

当我将导入语句更改为:

import validator from 'validator/es/lib/isEmail'
Run Code Online (Sandbox Code Playgroud)

我从你的问题中得到了错误(不能在模块之外使用 import 语句)。

据说导入validator/es/lib/isEmail仅导入库的一个子集。我不确定这会带来多大的改变;这可能没有什么区别。稍微大一点的构建会击败不起作用的构建。我建议先让它工作,然后如果确实需要的话优化构建大小。