当前位置: 首页 > 知识库问答 >
问题:

SyntaxError:无法在模块外部使用导入语句(从依赖项)

吴胜
2023-03-14

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

我想使用Svelte/kit中的验证器来验证电子邮件。但是,在导入ESM版本时,出现“无法在模块外使用导入语句”错误。我用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语句,但它是一个包。json没有指定“类型”:“模块”。我猜这是错误的根本原因。

  • 包裹。json具有“类型”:“模块”
  • SyntaxError:无法在模块外使用导入语句-此解决方案适用于您控制的代码,而不是依赖项
  • 导入ECMAScript 6时出现“Uncaught SyntaxError:无法在模块外使用import语句”-这似乎非常相似,但我在节点中发现此错误,而不是在浏览器中
  • 节点:v16。2.0
  • 斯维特基特:v1。0.0-next。115
  • 验证器:13.6。0

共有3个答案

麹鸿煊
2023-03-14

在阅读了他们的docs:https://github.com/validatorjs/validator.js#es6之后,它看起来像导入中的es部分,所以它可以被树形化。您可以通过正常导入来修复此错误:

import isURL from 'validator/lib/isURL';
柴嘉禧
2023-03-14

如果没有更多的信息,如果你的问题仅仅在于你依赖的代码的问题,考虑短期使用补丁包之类的东西来进行必要的调整,并且长期地,在确认器上打开一个PR。js回购!

对于补丁包,只需将“type”:“module”添加到包中即可。json位于节点\u modules/validator,然后运行npx补丁包validator。然后,您可以对输出的diff文件进行版本控制,并且假设补丁包是(dev)依赖项,则使用npm钩子自动进行更改。

这里的库的行为或缺陷可能是来自开发人员更多地记住像webpack这样按自己的条件导入esm的东西,而不是Svelte使用的节点模块解析模式走到这一步。(对此可能是错误的!)。

轩辕乐邦
2023-03-14

你试过这样导入吗?

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'

我从您的问题中得到错误(无法在模块外使用导入语句)。

导入validator/es/lib/isEmail可能只导入库的一个子集。我不确定这会有多大的不同;这可能没什么区别。稍微大一点的构建胜过不起作用的构建。我建议首先让它工作,然后优化构建大小,如果你真的需要的话。

 类似资料:
  • 我有一个ApolloServer项目给我带来了麻烦,所以我想我可能会更新它,并在使用最新的巴别塔时遇到问题。我的“index.js”是: 当我运行它时,我得到了错误 首先,我试图做一些事情来说服TPTB*这是一个模块(没有成功)。所以我把“导入”改成了“要求”,这就奏效了。 但是现在我在其他文件中有大约24个“导入”给我同样的错误。 *我确信我的问题的根源是我甚至不确定是什么在抱怨这个问题。我有点

  • 在测试其中一个功能时,我遇到了这种错误。到底是什么问题? /用户/user/websprojects/hsu/src/path finding/path finding。spec.js:1从'chai'导入{expect}^^^^^^ 语法错误:无法在WrapSafe(节点:内部/模块/cjs/加载器: 1018:16)的模块外使用导入语句。_compile(节点:内部/模块/cjs/加载器: 1

  • 问题内容: 我有一个ApolloServer项目给我带来麻烦,所以我认为我可能会更新它,并且在使用最新的Babel时遇到问题。我的“ index.js”是: 当我运行它时,出现错误“ SyntaxError:无法在模块外部使用import语句”。首先,我尝试做一些事情以说服TPTB *,这是一个模块(没有成功)。因此,我将“导入”更改为“需要”,并且此方法可行。 但是现在我在其他文件中有大约两打“

  • 我有一本书。节点js(07.10.19版本的node.js的最新版本)应用程序中的ts文件,带有导入节点模块而无默认导出。我使用这种结构:

  • 提前感谢您的帮助。 这个问题似乎已经在其他地方被提出和回答,但我相信我已经尝试了所有这些解决方案,但没有取得真正的进展。 我试图为webdriverIO创建一个自定义记者。然而,当所有导入都运行时,我得到以下错误: 无法在模块外使用导入语句 如果我试图执行文件顶部的导入语句,则会在导入WebdriverTestrasER行上出现上述错误。我可以通过使用要求来解决这个问题,但是在从@wdio/记者导

  • 试图将用户模型中的“uuid”作为