[英]Cannot use import statement outside a module, TypeScript NodeJS Firebase Functions project
I recently set up a Firebase Functions project using TypeScript.我最近使用 TypeScript 建立了一个 Firebase Functions 项目。 As far as I can tell I am using the same setup I have before in the past.
据我所知,我使用的设置与过去相同。 This time, however, when I run
firebase emulators:start
I receive the following error:然而,这一次,当我运行
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
As far as I can tell I have not changed anything from past projects, where I did not come across this issue.据我所知,我没有改变过去项目的任何内容,我没有遇到这个问题。 The only potential difference I can think of is that I updated my firebase tools using
npm install -g firebase-tools@latest
.我能想到的唯一潜在区别是我使用
npm install -g firebase-tools@latest
更新了我的 firebase 工具。 Below are some of the files from my project:以下是我项目中的一些文件:
src/index.ts src/index.ts
/* eslint-disable max-len */
import functions = require("firebase-functions");
import admin = require("firebase-admin");
admin.initializeApp();
...
.eslintrc.js .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 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 package.dev.json
{
"include": [
".eslintrc.js"
]
}
tsconfig.json tsconfig.json
{
"compilerOptions": {
"module": "ES2020",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "ES2020"
},
"compileOnSave": true,
"include": [
"src"
]
}
firebase.json firebase.json
{
...
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
]
},
...
}
My src/index.ts
import syntax matches what Google outlined in the Firestore documentation: Import the required modules and initialize an app .我的
src/index.ts
导入语法与 Google 在 Firestore 文档中概述的内容相匹配: 导入所需的模块并初始化应用程序。
I have searched around for an answer but I have not come across one yet.我已经四处寻找答案,但我还没有找到答案。 Here are a few of the resources I have tried:
以下是我尝试过的一些资源:
SyntaxError: Cannot use import statement outside a module Firebase Functions 语法错误:不能在模块外使用 import 语句 Firebase 函数
Node.js v13.14.0 Documentation Node.js v13.14.0 文档
Typescript: Cannot use import statement outside a module Typescript:无法在模块外使用导入语句
Thanks in advance for the help!在此先感谢您的帮助!
Turns out the problem has a simple solution.原来这个问题有一个简单的解决方案。 The firebase emulators do not support typescript.
firebase 仿真器不支持打字稿。 To run functions in the emulator you first need to compile to JS (reference the docs ).
要在模拟器中运行函数,您首先需要编译为 JS(参考文档)。 Both
npm run serve
and firebase deploy
will automatically transpile your code, firebase emulators:start
does NOT do this automatically. npm run serve
和firebase deploy
都会自动转译您的代码, firebase emulators:start
不会自动执行此操作。 When using the emulators you must first run npm run build
in your functions folder.使用模拟器时,您必须首先在您的函数文件夹中运行
npm run build
。
Also note, in your package.json you need your main
argument to reference the compiled JS code.另请注意,在您的 package.json 中,您需要
main
参数来引用已编译的 JS 代码。 I needed to update both my package.json
and tsconfig.json
.我需要更新我的
package.json
和tsconfig.json
。 Below are the final versions:以下是最终版本:
package.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 tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "es2017"
},
"compileOnSave": true,
"include": [
"src"
]
}
You need to use const functions = require("firebase-functions");
您需要使用
const functions = require("firebase-functions");
instead of import functions = require("firebase-functions");
而不是
import functions = require("firebase-functions");
- same for the 2nd import below it. - 下面的第二个导入相同。 The 'import' keyword can only be used with esmodules, while the const/require syntax is used in commonjs.
'import' 关键字只能用于 esmodules,而 const/require 语法用于 commonjs。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.