不能在模块外使用 import 语句,TypeScript NodeJS Firebase Functions 项目
Cannot use import statement outside a module, TypeScript NodeJS Firebase Functions project
我最近使用 TypeScript 建立了一个 Firebase Functions 项目。据我所知,我使用的是与过去相同的设置。然而,这一次,当我 运行 firebase emulators:start
时,我收到以下错误:
Error: Error occurred while parsing your function triggers.
<Local Computer Path>/firebase/functions/src/index.ts:3
import functions = require("firebase-functions");
^^^^^^
SyntaxError: Cannot use import statement outside a module
at Object.compileFunction (node:vm:352:18)
at wrapSafe (node:internal/modules/cjs/loader:1031:15)
at Module._compile (node:internal/modules/cjs/loader:1065:27)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at loadModule (/opt/homebrew/lib/node_modules/firebase-tools/lib/deploy/functions/runtimes/node/triggerParser.js:10:16)
at /opt/homebrew/lib/node_modules/firebase-tools/lib/deploy/functions/runtimes/node/triggerParser.js:34:21
据我所知,我没有改变过去的项目,我没有遇到这个问题。我能想到的唯一潜在区别是我使用 npm install -g firebase-tools@latest
更新了我的 firebase 工具。以下是我项目中的一些文件:
src/index.ts
/* eslint-disable max-len */
import functions = require("firebase-functions");
import admin = require("firebase-admin");
admin.initializeApp();
...
.eslintrc.js
module.exports = {
root: true,
env: {
es6: true,
node: true,
},
extends: [
"eslint:recommended",
"plugin:import/errors",
"plugin:import/warnings",
"plugin:import/typescript",
"google",
"plugin:@typescript-eslint/recommended",
],
parser: "@typescript-eslint/parser",
parserOptions: {
project: ["tsconfig.json", "tsconfig.dev.json"],
sourceType: "module",
tsconfigRootDir: __dirname,
},
ignorePatterns: [
"/lib/**/*", // Ignore built files.
],
plugins: [
"@typescript-eslint",
"import",
],
rules: {
"indent": ["error", 2],
"object-curly-spacing": ["error", "always"],
"quotes": ["error", "double"],
"import/no-unresolved": 0,
},
};
package.json
{
"name": "functions",
"scripts": {
"lint": "eslint --ext .js,.ts .",
"build": "tsc",
"serve": "npm run build && firebase emulators:start --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "16"
},
"main": "./src/index.ts",
"dependencies": {
"firebase-admin": "^10.0.2",
"firebase-functions": "^3.18.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.12.0",
"@typescript-eslint/parser": "^5.12.0",
"eslint": "^8.9.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-import": "^2.25.4",
"firebase-functions-test": "^0.2.0",
"typescript": "^4.5.4"
},
"private": true,
"type": "module",
"module": "ES2020"
}
package.dev.json
{
"include": [
".eslintrc.js"
]
}
tsconfig.json
{
"compilerOptions": {
"module": "ES2020",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "ES2020"
},
"compileOnSave": true,
"include": [
"src"
]
}
firebase.json
{
...
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
]
},
...
}
我的 src/index.ts
导入语法与 Firestore 文档中概述的 Google 相匹配:Import the required modules and initialize an app.
我四处寻找答案,但还没有找到答案。以下是我尝试过的一些资源:
Node.js v13.14.0 Documentation
在此先感谢您的帮助!
您需要使用
const functions = require("firebase-functions");
而不是
import functions = require("firebase-functions");
- 下面的第二个导入相同。 'import' 关键字只能与 esmodules 一起使用,而 const/require 语法在 commonjs 中使用。
原来这个问题有一个简单的解决方案! firebase 模拟器不支持打字稿。要在模拟器中使用 运行 功能,您首先需要编译为 JS(参考文档 docs)。 npm run serve
和 firebase deploy
都会自动转译您的代码,firebase emulators:start
不会 自动执行此操作。使用模拟器时,您必须先在函数文件夹中 运行 npm run build
。
另请注意,在您的 package.json 中,您需要 main
参数来引用已编译的 JS 代码。我需要更新我的 package.json
和 tsconfig.json
。以下是最终版本:
package.json
{
"name": "functions",
"scripts": {
"lint": "eslint --ext .js,.ts .",
"build": "tsc",
"serve": "npm run build && firebase emulators:start --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "16"
},
"main": "./lib/index.js",
"dependencies": {
"firebase-admin": "^10.0.2",
"firebase-functions": "^3.18.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.12.0",
"@typescript-eslint/parser": "^5.12.0",
"eslint": "^8.9.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-import": "^2.25.4",
"firebase-functions-test": "^0.2.0",
"typescript": "^4.5.4"
},
"private": true
}
tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "es2017"
},
"compileOnSave": true,
"include": [
"src"
]
}
我最近使用 TypeScript 建立了一个 Firebase Functions 项目。据我所知,我使用的是与过去相同的设置。然而,这一次,当我 运行 firebase emulators:start
时,我收到以下错误:
Error: Error occurred while parsing your function triggers.
<Local Computer Path>/firebase/functions/src/index.ts:3
import functions = require("firebase-functions");
^^^^^^
SyntaxError: Cannot use import statement outside a module
at Object.compileFunction (node:vm:352:18)
at wrapSafe (node:internal/modules/cjs/loader:1031:15)
at Module._compile (node:internal/modules/cjs/loader:1065:27)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at loadModule (/opt/homebrew/lib/node_modules/firebase-tools/lib/deploy/functions/runtimes/node/triggerParser.js:10:16)
at /opt/homebrew/lib/node_modules/firebase-tools/lib/deploy/functions/runtimes/node/triggerParser.js:34:21
据我所知,我没有改变过去的项目,我没有遇到这个问题。我能想到的唯一潜在区别是我使用 npm install -g firebase-tools@latest
更新了我的 firebase 工具。以下是我项目中的一些文件:
src/index.ts
/* eslint-disable max-len */
import functions = require("firebase-functions");
import admin = require("firebase-admin");
admin.initializeApp();
...
.eslintrc.js
module.exports = {
root: true,
env: {
es6: true,
node: true,
},
extends: [
"eslint:recommended",
"plugin:import/errors",
"plugin:import/warnings",
"plugin:import/typescript",
"google",
"plugin:@typescript-eslint/recommended",
],
parser: "@typescript-eslint/parser",
parserOptions: {
project: ["tsconfig.json", "tsconfig.dev.json"],
sourceType: "module",
tsconfigRootDir: __dirname,
},
ignorePatterns: [
"/lib/**/*", // Ignore built files.
],
plugins: [
"@typescript-eslint",
"import",
],
rules: {
"indent": ["error", 2],
"object-curly-spacing": ["error", "always"],
"quotes": ["error", "double"],
"import/no-unresolved": 0,
},
};
package.json
{
"name": "functions",
"scripts": {
"lint": "eslint --ext .js,.ts .",
"build": "tsc",
"serve": "npm run build && firebase emulators:start --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "16"
},
"main": "./src/index.ts",
"dependencies": {
"firebase-admin": "^10.0.2",
"firebase-functions": "^3.18.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.12.0",
"@typescript-eslint/parser": "^5.12.0",
"eslint": "^8.9.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-import": "^2.25.4",
"firebase-functions-test": "^0.2.0",
"typescript": "^4.5.4"
},
"private": true,
"type": "module",
"module": "ES2020"
}
package.dev.json
{
"include": [
".eslintrc.js"
]
}
tsconfig.json
{
"compilerOptions": {
"module": "ES2020",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "ES2020"
},
"compileOnSave": true,
"include": [
"src"
]
}
firebase.json
{
...
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
]
},
...
}
我的 src/index.ts
导入语法与 Firestore 文档中概述的 Google 相匹配:Import the required modules and initialize an app.
我四处寻找答案,但还没有找到答案。以下是我尝试过的一些资源:
Node.js v13.14.0 Documentation
在此先感谢您的帮助!
您需要使用
const functions = require("firebase-functions");
而不是
import functions = require("firebase-functions");
- 下面的第二个导入相同。 'import' 关键字只能与 esmodules 一起使用,而 const/require 语法在 commonjs 中使用。
原来这个问题有一个简单的解决方案! firebase 模拟器不支持打字稿。要在模拟器中使用 运行 功能,您首先需要编译为 JS(参考文档 docs)。 npm run serve
和 firebase deploy
都会自动转译您的代码,firebase emulators:start
不会 自动执行此操作。使用模拟器时,您必须先在函数文件夹中 运行 npm run build
。
另请注意,在您的 package.json 中,您需要 main
参数来引用已编译的 JS 代码。我需要更新我的 package.json
和 tsconfig.json
。以下是最终版本:
package.json
{
"name": "functions",
"scripts": {
"lint": "eslint --ext .js,.ts .",
"build": "tsc",
"serve": "npm run build && firebase emulators:start --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "16"
},
"main": "./lib/index.js",
"dependencies": {
"firebase-admin": "^10.0.2",
"firebase-functions": "^3.18.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.12.0",
"@typescript-eslint/parser": "^5.12.0",
"eslint": "^8.9.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-import": "^2.25.4",
"firebase-functions-test": "^0.2.0",
"typescript": "^4.5.4"
},
"private": true
}
tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "es2017"
},
"compileOnSave": true,
"include": [
"src"
]
}