27

有没有办法在 Cloud Functions for Firebase 中使用 es6 语法?

import functions from 'firebase-functions';

export const helloWorld = functions.https.onRequest((request, response) => {
 response.send("Hello from Firebase!");
})

失败:

SyntaxError: Unexpected token import
4

7 回答 7

16

简短的回答是,不,你还不能这样做。它与 Cloud Functions 没有任何关系。它与节点有关。如果您使用命令将 node 指向您的 index.js node index.js,您将看到完全相同的错误。

关于为什么这是一个复杂问题的长答案已经在一些博客中讨论过,例如这里这里

编辑:firebase CLI现在支持使用 TypeScript 的项目,这使您可以访问 ES7 语法。它会自动将其编译为 ES6 以部署到 Cloud Functions。

于 2017-03-11T21:58:58.907 回答
11

啊,想通了。import要使用像and这样的ES6 功能const,甚至像awaitand这样的 ES7 功能,请通过重命名来async使用Typescriptindex.jsindex.ts

这是我的index.ts

import * as functions from 'firebase-functions';

export const helloWorld = functions.https.onRequest((req, resp) => {
 resp.send("Hello from Firebase!");
});

Atom 还提示我生成一个functions/tsconfig.json文件。我不确定这是必要的,但这是生成的:

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "isolatedModules": false,
        "jsx": "react",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "declaration": false,
        "noImplicitAny": false,
        "noImplicitUseStrict": false,
        "removeComments": true,
        "noLib": false,
        "preserveConstEnums": true,
        "suppressImplicitAnyIndexErrors": true,
        "lib": ["es2015", "es2015.promise"]
    },
    "exclude": [
        "node_modules",
        "typings/browser",
        "typings/browser.d.ts"
    ],
    "compileOnSave": true,
    "buildOnSave": false,
    "atom": {
        "rewriteTsconfig": false
    }
}

这是由生成的输出firebase deploy --only functions

=== Deploying to 'PROJECTNAME'...

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
i  runtimeconfig: ensuring necessary APIs are enabled...
✔  runtimeconfig: all necessary APIs are enabled
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (1.53 KB) for uploading
✔  functions: functions folder uploaded successfully
i  starting release process (may take several minutes)...
i  functions: creating function helloWorld...
✔  functions[helloWorld]: Successful create operation.
✔  functions: all functions deployed successfully!

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/PROJECTNAME/overview
Function URL (helloWorld): https://us-central1-PROJECTNAME.cloudfunctions.net/helloWorld
于 2017-03-15T21:58:55.283 回答
7

Firebase CLI 现在支持 node.js 14,但这并不意味着可以将 Cloud Functions 编写为 ES 模块。

缺少的部分是:

  1. firebase-functions(3.13.1) npm 模块不提供 ES 导出

  2. Firebase 模拟器 ( firebase-tools9.2.2) 不加载作为 ES 模块的云函数:

    [emul] require() of /Users/.../functions/index.js from /usr/local/lib/node_modules/firebase-tools/lib/emulator/functionsEmulatorRuntime.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
    

Meta:虽然建议的方法(esm包;转换为 TypeScript)可能对某些人有用,但我个人只对纯 ES 模块功能感兴趣。这也符合问题的标题(“... using es6 import statement”),所以我决定写一个当前(2021年1月)情况的总结。

将 Cloud Functions 编码为 ES 模块并没有直接的回报。这只是一个语法问题:如果我用它们编写我的 web 应用程序,并且 node 支持它们,我自然更愿意将它们用于 Cloud Functions。


如果它对您很重要,这是跟随/的门票。

于 2021-01-31T17:30:10.190 回答
6

可以通过完整步骤检查此链接:

一、弃用: https ://codeburst.io/es6-in-cloud-functions-for-firebase-959b35e31cb0

  1. 创建./functionsES6并复制package.json,yarn.lock并将index.js其从./functions.

  2. 将预设添加到./functionsES6/package.json

在此处输入图像描述

  1. 当您在根路径中时 ./functionsES6 -Yarn Deploy

在此处输入图像描述

二、更新: https ://codeburst.io/es6-in-cloud-functions-for-firebase-2-415d15205468

你可以使用这些package.json

在此处输入图像描述

于 2017-12-22T06:09:06.170 回答
2

简单的方法是使用 esm packahe https://www.npmjs.com/package/esm

require = require("esm")(module /*, options*/ )
于 2020-07-24T16:52:01.743 回答
1

使用 ES 模块现在是实验性的,要在云函数中使用 ESM,您必须"type": "module"package.json.

  ...
  "type": "module",
  ...
}

然后您可以使用导入和导出语句。
参考:https
://cloud.google.com/functions/docs/concepts/nodejs-runtime#using_es_modules_experimental 代码示例:https ://github.com/GoogleCloudPlatform/functions-framework-nodejs/blob/master/docs/esm/自述文件.md

于 2021-10-15T10:45:05.940 回答
-3

使用纯 JS 导入库也将修复它。

例子:

var _ = require('lodash');

代替:

import _ from 'lodash';
于 2017-08-02T20:09:55.743 回答