Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase云函数无法识别传输的ES5:Firebase未定义_Javascript_Node.js_Babeljs_Firebase Admin_Webpack 3 - Fatal编程技术网

Javascript Firebase云函数无法识别传输的ES5:Firebase未定义

Javascript Firebase云函数无法识别传输的ES5:Firebase未定义,javascript,node.js,babeljs,firebase-admin,webpack-3,Javascript,Node.js,Babeljs,Firebase Admin,Webpack 3,首先介绍一下,在我编写此Firebase函数时,它不支持较新版本的node中的async和Wait等功能。我试图通过将我的代码传输到他们当前支持的节点版本来克服这个问题 我正在使用Webpack3捆绑我的react.js web应用程序。我已经设置了两个独立的配置—一个用于开发,另一个用于生产。我使用第三个confirguration作为第二个任务在生产pipiline上执行,以获取cloudfunctions.js并使用babel传输代码将其输出到部署dir functions/index.j

首先介绍一下,在我编写此Firebase函数时,它不支持较新版本的node中的async和Wait等功能。我试图通过将我的代码传输到他们当前支持的节点版本来克服这个问题

我正在使用Webpack3捆绑我的react.js web应用程序。我已经设置了两个独立的配置—一个用于开发,另一个用于生产。我使用第三个confirguration作为第二个任务在生产pipiline上执行,以获取cloudfunctions.js并使用babel传输代码将其输出到部署dir functions/index.js

我不是在.babelrc中描述传输文件需求,而是使用webpack将这些详细信息添加到规则模块内部的选项配置对象中

我已经成功地传输了代码,但是Firebase一直抱怨没有定义“Firebase”。我已经把这个错误的触发范围缩小到了导入的第一行代码

任何能为我指明正确方向的建议,我都非常感激

import functions from ''firebase-functions';
事实上,我已经尝试过使用require的Commonjs,并在ES6导入/导出中进行了其他尝试

Package.json:

functions.config.js网页包

环境保护

操作系统:Windows 10 节点版本:8.9.4 包装经理:npm 外壳:Windows外壳 浏览器和版本:Chrome 64.0.3282.186 语言:Javascript 预期行为

传输成功。 成功部署到firebase 实际行为

成功地传送。 点击firebase deploy-only functions命令后,继续接收此日志,但出现相同错误:

函数/index.js[输出]

取决于我是否包括丑陋的插件或没有输出将缩小或正常。 Webpack还接受@babel/polyfill,因此帮助功能被添加到此文件中。 我没有包括outfile,因为unfinify版本的代码长度为9049行,而minified则不清晰

我试过了

使用巴别塔6号和巴别塔7号仍然没有结果。 环境配置 我已经尝试直接提供硬编码的访问对象。 我显然遗漏了一些东西,但我已经看过这篇文章/回购协议好几次了

其他注释


我正在尽我所能摆脱打字脚本和处理承诺的回叫地狱。我也尝试不直接依赖npm直接运行命令,而是利用webpack。

我可以让webpack使用babel将代码传输到函数/index.js。我解决了这个问题

使用webpack时,请确保将output.libraryTarget指定为“umd”

以下是网页包confg文件:

const
    path               = require('path'),
    pkg                = require('../package'),
    GenerateJsonPlugin = require('generate-json-webpack-plugin');

const
    externals = [
        'firebase-admin',
        'firebase-functions'
    ], 
    genPackage = () => ({
        name    : 'functions',
        private : true,
        dependencies: externals.reduce(
            (acc, name) =>
                Object.assign({}, acc, {
                [name]:
                    pkg.dependencies[name] ||
                    pkg.devDependencies[name]
                }),
            {}
        )
    });

module.exports = {
    entry : [
      'babel-polyfill',
      './cloudfunctions.js'
    ],
    output: {
        path          : path.resolve(__dirname,'../functions'),
        filename      : 'index.js',
        libraryTarget : 'umd'
    },
    module : {
        rules : [
            {
                exclude : /node_modules/,
                loader  : 'babel-loader',
                query   : { 
                    presets : [ 'babel-preset-env' ] 
                }
            }
        ]
    },
    resolve: {
        extensions: ['.js']
    },
    node: {
        fs  : 'empty',
        net : 'empty',
        tls : 'empty'
    },
    externals: externals.reduce(
        (acc, name) => Object.assign({}, acc, { [name]: true }),{}
    ),
    plugins: [
        new GenerateJsonPlugin('package.json', genPackage())
    ]
};

干杯

看起来webpack可能是罪魁祸首。在额外测试之后,似乎只要有导入/需求,它就会失败。看起来这个问题:
const
    path               = require('path'),
    pkg                = require('../package'),
    GenerateJsonPlugin = require('generate-json-webpack-plugin'),
    UglifyJSPlugin     = require('uglifyjs-webpack-plugin'),
    webpack            = require('webpack');

const externals = [
    'firebase-admin',
    'firebase-functions'
]

const genPackage = () => ({
    name         : 'functions',
    private      : true,
    main         : 'index.js',
    license      : 'MIT',
    dependencies : externals.reduce( (acc, name) => Object.assign({}, acc, { [name]: pkg.dependencies[name] || pkg.devDependencies[name] }), {} )
})

module.exports = {
    entry  : [
        '@babel/polyfill',
        path.join(__dirname, '../cloudfunctions.js')
    ],
    output : {
        path     : path.join(__dirname, '../functions/'),
        filename : 'index.js'
},
    module : {
        rules: [
            {
                test    : /\.js$/,
                loader  : 'babel-loader',
                options : 
                    {
                        presets : [
                            [ 
                                '@babel/env',
                                { 
                                    option : { 
                                        targets : { 
                                            node : '6.11.5'
                                        }
                                    }
                                }
                            ]                 
                        ],
                        plugins: [
                            '@babel/plugin-proposal-object-rest-spread'
                        ]   
                    }
                ,
                exclude : /node_modules/
            }
        ]
    },
    externals : externals.reduce( (acc, name) => Object.assign({}, acc, { [name]: true }), {} ),
    plugins   : [
        new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) }),
        new UglifyJSPlugin(),
        new GenerateJsonPlugin('package.json', genPackage())
    ]
}
i  deploying functions
i  functions: ensuring necessary APIs are enabled...
+  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...

Error: Error occurred while parsing your function triggers.

ReferenceError: firebase is not defined
at Object.module.exports (C:\Users\Andrew Redican\Compass\functions\index.js:9040:18)
at __webpack_require__ (C:\Users\Andrew Redican\Compass\functions\index.js:20:30)
at Object.module.exports (C:\Users\Andrew Redican\Compass\functions\index.js:8967:17)
at __webpack_require__ (C:\Users\Andrew Redican\Compass\functions\index.js:20:30)
at Object.<anonymous> (C:\Users\Andrew Redican\Compass\functions\index.js:3687:18)
at __webpack_require__ (C:\Users\Andrew Redican\Compass\functions\index.js:20:30)
at C:\Users\Andrew Redican\Compass\functions\index.js:63:18
at Object.<anonymous> (C:\Users\Andrew Redican\Compass\functions\index.js:66:10)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
let functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);
const
    path               = require('path'),
    pkg                = require('../package'),
    GenerateJsonPlugin = require('generate-json-webpack-plugin');

const
    externals = [
        'firebase-admin',
        'firebase-functions'
    ], 
    genPackage = () => ({
        name    : 'functions',
        private : true,
        dependencies: externals.reduce(
            (acc, name) =>
                Object.assign({}, acc, {
                [name]:
                    pkg.dependencies[name] ||
                    pkg.devDependencies[name]
                }),
            {}
        )
    });

module.exports = {
    entry : [
      'babel-polyfill',
      './cloudfunctions.js'
    ],
    output: {
        path          : path.resolve(__dirname,'../functions'),
        filename      : 'index.js',
        libraryTarget : 'umd'
    },
    module : {
        rules : [
            {
                exclude : /node_modules/,
                loader  : 'babel-loader',
                query   : { 
                    presets : [ 'babel-preset-env' ] 
                }
            }
        ]
    },
    resolve: {
        extensions: ['.js']
    },
    node: {
        fs  : 'empty',
        net : 'empty',
        tls : 'empty'
    },
    externals: externals.reduce(
        (acc, name) => Object.assign({}, acc, { [name]: true }),{}
    ),
    plugins: [
        new GenerateJsonPlugin('package.json', genPackage())
    ]
};