我正在使用ESModules编写Node.js代码(在TypeScript中),我需要访问__dirname
。为了访问CommonJS中__dirname
的ESM等效项,我调用了dirname(fileURLToPath(import.meta.url))
。我还在使用TypeScript编写Jest测试。使用this指南,我设置了Babel。当我运行jest
命令时,我得到
const DIRNAME = (0, _path.dirname)((0, _url.fileURLToPath)(import.meta.url));
^^^^
SyntaxError: Cannot use 'import.meta' outside a module
这是我写的文件
someCode.ts
:*
import { dirname } from "path";
import { fileURLToPath } from "url";
const DIRNAME = dirname(fileURLToPath(import.meta.url));
export const x = 5;
someCode.test.ts
:*
import { x } from "./someCode";
it("Returns 5 as the result", () => {
expect(x).toEqual(5);
});
.babelrc.json
:*
{
"presets": [
["@babel/preset-env", { "targets": { "node": "current" } }],
"@babel/preset-typescript"
]
}
- 一米七三 *
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "node"
},
"include": ["./src/**/*.ts", "./src/**/*.js"]
}
package.json
:*
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
"scripts": {
"test": "jest"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.12.7",
"@babel/preset-env": "^7.12.7",
"@babel/preset-typescript": "^7.12.7",
"jest": "^26.6.3",
"typescript": "^4.1.2"
}
}
环境:
- 节点:14.1.0
- 有关模块版本,请参见
package.json
*
- 有关模块版本,请参见
9条答案
按热度按时间b1payxdu1#
解决方案:模块化ESM代码并对其进行模拟。
我最近也遇到了这个问题,最后我不得不:
1.将ESM特定问题(例如
import.meta
功能)导出到其自身的“utils”文件/函数中。1.然后在mocks目录中创建一个不需要ESM特定功能的模拟函数。
1.在使用该功能的文件中,声明
jest.mock("/path/to/that/file.ts")
该过程类似于:
原始文件结构
第一个
新的文件结构
标题
然后在文件本身中:
对于试验:
c2e8gylq2#
我们正在使用
import.meta.url
来利用web worker,例如使用native worker support in Webpack 5。这工作得很好,但是在运行Jest测试时失败了。就我所知,
babel-vite-preset
* 没有 * 处理这个问题。关于提取和模拟使用import.meta
的代码的首要答案确实有效,但很笨拙。我发现目前最好的解决方案是使用babel-plugin-transform-import-meta。这个简单的插件用Node.js代码替换了
import.meta.url
语法来检索当前文件的URL,所以它在测试中工作得很好。注意,你只想在运行测试时激活这个插件。pwuypxnk3#
我有同样的问题,我用一个巴别塔插件修复它:search-and-replace
在我的代码中,我将所有的
import.meta.url
更改为import_meta_url
我还在babel config中添加了插件,在开发和生产中通过
import.meta.url
和resolve(__dirname, 'workers')
对其进行更改我之所以能够这样做,是因为它与我的所有用例都匹配,例如,如果在不同的场景中需要将
import_meta_url
替换为不同的字符串,则需要使用import_meta_url_1
import_meta_url_2
等最后我的
babel.config.js
GL语言
57hvy0tb4#
我也遇到了这个问题。我能够通过在Babel处理过程中动态插入一个正确的值来解决这个问题。我使用了codegen macro for babel而不是建议的
search-and-replace
Babel插件。e5nszbig5#
babel-vite-preset
我觉得这个很棒。
非官方。
你可以选择只使用它
babel-plugin-transform-vite-meta-env
插件或使用整个预设和设置配置如下ny6fqffe6#
我发现了一个解决方案,它是如此荒谬,我甚至不相信当它工作:
创建一个commonjs文件,比如“currentPath.cjs”,在里面放一些东西:
在模块中用途:
并观看魔术发生。PS:在对任何对象使用path.normalize()之前,请先使用它。
mu0hgdu07#
在您的
tsconfig.json
中更改为xuo3flqw8#
我在Node.js,Express,TypeScript,Jest,ts-jext项目中遇到了这个问题。对我来说,问题是正确配置jest.config.json。
我把我的档案发出去了也许能帮到什么人。
包.JSON
服务器配置JSON
简易配置JS
bqjvbblv9#
1.用下面命令更改tsconfig
2.在jest.config中添加以下内容
3.现在它将开始给出错误无法使用import. meta要解决此问题,请在Babel配置中添加以下内容:`
@babel/plugin-transform-runtime,babel-plugin-transform-import- meta这些插件将帮助您解决这个问题