不能在模块、Typescript、WebdriverIO 外使用导入语句

Posted

技术标签:

【中文标题】不能在模块、Typescript、WebdriverIO 外使用导入语句【英文标题】:Cannot Use Import Statement Outside Module, Typescript, WebdriverIO 【发布时间】:2021-09-01 10:09:54 【问题描述】:

提前感谢您的帮助。

这个问题似乎已经在其他地方提出并得到了回答,但我相信我已经尝试了所有这些解决方案,但都没有取得真正的进展。

我正在尝试为 webdriverIO 创建一个自定义报告器。但是,当所有导入都在运行时,我收到以下错误:

SyntaxError: 不能在模块外使用 import 语句

如果我尝试在 wdio.conf 文件的顶部执行 import 语句,我会在 import WebdriverTestrailsReporter 行收到上述错误。我可以通过使用 require 来解决这个问题,但是在从 import WDIOReporter from '@wdio/reporter' 上的 typescript 类执行导入时会遇到相同的错误。

当我尝试将 "type": "module" 添加到我的 package.json 时,我收到一个新错误:

错误 [ERR_REQUIRE_ESM]:必须使用导入来加载 ES 模块: /Users/XXXXX/WebstormProjects/integration_test_framework/wdio.conf.local.js 不支持 ES 模块的 require()。要求()的 /Users/XXXXX/WebstormProjects/integration_test_framework/wdio.conf.local.js 从 /Users/XXXXX/WebstormProjects/integration_test_framework/node_modules/@wdio/config/build/lib/ConfigParser.js 是一个 ES 模块文件,因为它是一个 .js 文件,其最近的父级 package.json 包含 "type": "module" 定义所有 .js 文件 该包范围作为 ES 模块。而是将 wdio.conf.local.js 重命名为 以 .cjs 结尾,将需要的代码更改为使用 import(),或删除 “类型”:“模块”来自 /Users/n1531435/WebstormProjects/integration_test_framework/package.json。

使用 cjs 文件扩展名让我回到一开始的导入错误。我无法更改需要的代码,因为它存在于 WDIO ConfigParser 而不是我的项目中。

我也玩过很多 tsconfig 中的值,包括目标值(es2015、es2017),但似乎没有任何效果。有什么想法吗?

据我了解,此设置中有 4 个相关文件。我在下面复制了它们:

wdio.conf.js tsconfig package.json 和我的 wdio 自定义 Reporter

相关文件sn-ps:

wdio.conf.js

//const WebdriverTestrailsReporter = require('./src/test/ui/WebdriverTestrailsReporter.js');
import WebdriverTestrailsReporter from './src/test/ui/WebdriverTestrailsReporter';

var isHeadless = process.env.HEADLESS === 'TRUE';
var useFirefox = process.env.USE_FIREFOX === 'TRUE';
var useChrome = process.env.USE_CHROME ? process.env.USE_CHROME === 'TRUE' : true;


exports.config = 
    reporters: ['spec', WebdriverTestrailsReporter]

package.json


    "name": REDACTED
    "version": "1.1.0",
    "description": "",
    "main": "index.js",
    "bin": 
        REDACTED
    ,
    "publishConfig": 
        "registry": "https://repo.forge.lmig.com/api/npm/npm-releases/"
    ,
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": 
        "@wdio/allure-reporter": "^6.4.7",
        "@wdio/cli": "^6.4.5",
        "@wdio/local-runner": "^6.4.5",
        "@wdio/mocha-framework": "^6.4.0",
        "@wdio/sauce-service": "^6.4.6",
        "@wdio/spec-reporter": "^6.4.7",
        "@wdio/sync": "^6.4.5",
        "chromedriver": "^90.0.0",
        "fibers": "^5.0.0",
        "geckodriver": "^1.20.0",
        "husky": "^4.3.0",
        "mocha": "^8.1.1",
        "prettier": "^2.2.0",
        "selenium-webdriver": "^4.0.0-alpha.7",
        "wdio-chromedriver-service": "^6.0.4",
        "wdio-geckodriver-service": "^1.1.1"
    ,
    "dependencies": 
        "@types/chai": "^4.2.12",
        "@types/es6-promise": "^3.3.0",
        "@types/mocha": "^8.0.2",
        "@types/node": "^14.11.5",
        "async": "^3.2.0",
        "axios": "^0.20.0",
        "chai": "^4.2.0",
        "date-fns": "^2.16.1",
        "execa": "^4.1.0",
        "graphql": "^15.3.0",
        "graphql-request": "^3.2.0",
        "mocha": "^8.1.1",
        "sleep": "^6.3.0",
        "ts-node": "^9.0.0",
        "typescript": "^4.1.2",
        "typings": "^2.1.1"
    ,
    "husky": 
        "hooks": 
            "pre-push": "npm run tsc && npm run prettier"
        
    

Reporter(前两行,我们永远不会超过它们)

import WDIOReporter from '@wdio/reporter'
import  TestRailConfig  from '../TestRailConfig';

tsconfig


    "compilerOptions": 
        "module": "commonjs",
        "target": "es6",
        "sourceMap": true,
        "skipLibCheck": true,
        "lib": ["es6"],
        "outDir": "lib",
        "types": ["node", "@wdio/sync", "@wdio/mocha-framework"]
    ,
    "include": ["src/**/*"],
    "exclude": ["node_modules"]

【问题讨论】:

【参考方案1】:

如果您使用 require 则使用该格式的所有内容,否则如果您想使用 import 然后添加模块类型并将所有 require 替换为 import。

如果您想在某些文件中使用 require 并在某些文件中导入,则将文件重命名为具有 require 而不是 .js 的 .cjs。请注意,您不能将 ES6 和常见的 js 格式混合在一个文件中。您应该在该文件中使用 require 或 import。

使用 typescript 时最好使用 E6,

【讨论】:

以上是关于不能在模块、Typescript、WebdriverIO 外使用导入语句的主要内容,如果未能解决你的问题,请参考以下文章

Mocha + TypeScript:不能在模块外使用导入语句

Typescript、React、Electron:不能在模块外使用 import 语句

Typescript & TypeORM:不能在模块外使用 import 语句

不能在模块、Typescript、WebdriverIO 外使用导入语句

不能在模块 Electron React Typescript 之外使用 import 语句

Electron 和 TypeScript (electron-builder):“不能在模块外使用 import 语句”