简体   繁体   English

不能在模块外使用 import 语句,TypeScript NodeJS Firebase Functions 项目

[英]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 servefirebase 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.jsontsconfig.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.

相关问题 SyntaxError:无法在具有共享 package 的模块外部使用导入语句 - SyntaxError: Cannot use import statement outside a module with shared package 部署 firebase 项目时出现错误显示“找不到模块 firebase-functions” - Error shows 'cannot find module firebase-functions' when deploying a firebase project 未找到模块:错误:您尝试导入项目 src/ 目录之外的 /firebase/app - Module not found: Error: You attempted to import /firebase/app which falls outside of the project src/ directory 在 NodeJS Cloud Functions 中使用本地模块的最佳方式是什么? - What is the best way to use local module in NodeJS Cloud Functions? 在 firebase 云功能中具有 typescript 的 firebase-admin - firebase-admin with typescript in firebase cloud functions 有没有办法在没有 Cloud Functions 的情况下在简单的 NodeJS 中使用 Firebase RTDB 触发器? - Is there a way to use Firebase RTDB triggers inside simple NodeJS without Cloud Functions? “您试图通过调用 firebase.app() 来使用 Android 项目中未安装的 firebase 模块。” - "You attempted to use a firebase module that's not installed on your Android project by calling firebase.app()." Firebase v8 Typescript 用户定义导入 - Firebase v8 Typescript definition import for User 您试图通过调用 firebase.storage() 来使用未安装在 android 项目上的 firebase 模块 - You attempted to use a firebase module that's not installed on your android project by calling firebase.storage() firebase 无法确定项目id - firebase cannot determine project id
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM