【问题标题】:NodeJS Won't Import a Non-NodeJS FileNodeJS 不会导入非 NodeJS 文件
【发布时间】:2020-03-27 04:33:50
【问题描述】:

我的网站上有以下两个文件:

  • firebase.js
  • gridsome-server.js

firebase.js 是一个“常规”javascript 文件,包含以下内容:

import firebase from 'firebase/app'
import 'firebase/firestore'

const config = {
  apiKey: '[APIKEY],
  authDomain: '[AUTHDOMAIN],
  databaseURL: '[DATABASEURL],
  projectId: '[PROJECTID],
  storageBucket: '[STORAGEBUCKET],
  messagingSenderId: '[MESSAGINGSENDERID],
  appId: '[APPID]'
}

firebase.initializeApp(config)

const db = firebase.firestore()

export default db

现在,我想将默认导出 (db) 导入 gridsome-server.js -(我相信)这是一个 nodejs 文件。现在,我认为我可以执行以下操作:const db = require('./src/config/firebase.js') - 但这不起作用。我收到以下错误消息:

Initializing plugins...
SyntaxError: gridsome.server.js: Unexpected identifier (1:12)

> 1 | const db = require('./src/config/firebase')
    |            ^
  2 |
  3 | module.exports = function(api) {
  4 |   api.loadSource(({ addCollection }) => {
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

所以我将require 更改为import - 如下:import db from './src/config/firebase。但这也给了我一个错误:

Initializing plugins...
C:\code\tutorials\vue\gridsome\vuetify-gridsome\gridsome.server.js:2
import db from './src/config/firebase'
       ^^

SyntaxError: Unexpected identifier
    at Module._compile (internal/modules/cjs/loader.js:723:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Plugins.initialize (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\app\Plugins.js:45:11)
    at App.init (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\app\App.js:120:18)
    at App.bootstrap (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\app\App.js:49:16)
    at module.exports (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\app\index.js:12:18)
    at module.exports (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\develop.js:20:21)
    at C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\index.js:44:12
    at Command.program.command.description.option.option.action.args (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\index.js:13:44)
    at Command.listener (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\commander\index.js:315:8)
    at Command.emit (events.js:198:13)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

所以我被卡住了——如何将firebase.js 导入gridsome-server.js

更新

我还尝试更改为firebase.js 中的命名导出(即export const db)并使用gridsome-server.js 中的命名导入(即import { db } from...)。这也会导致错误:

Initializing plugins...
C:\code\tutorials\vue\gridsome\vuetify-gridsome\gridsome.server.js:2
import { db } from './src/config/firebase'
       ^

SyntaxError: Unexpected token {
    at Module._compile (internal/modules/cjs/loader.js:723:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Plugins.initialize (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\app\Plugins.js:45:11)
    at App.init (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\app\App.js:120:18)
    at App.bootstrap (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\app\App.js:49:16)
    at module.exports (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\app\index.js:12:18)
    at module.exports (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\lib\develop.js:20:21)
    at C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\index.js:44:12
    at Command.program.command.description.option.option.action.args (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\gridsome\index.js:13:44)
    at Command.listener (C:\code\tutorials\vue\gridsome\vuetify-gridsome\node_modules\commander\index.js:315:8)
    at Command.emit (events.js:198:13)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

【问题讨论】:

  • 可能正在使用 AoT 导入,类似于 angular.js 而不是您。你需要做import { db } from '' 默认导出甚至可能不起作用,你需要导出一个实际变量export db
  • @T.J.Crowder Gridsome 使用 webpack。
  • @Andrei 我也尝试过import { db } from '' 并且还收到一条错误消息。我刚刚将 firebase.js 商店更改为 export const db... 并尝试了 import { db }... 并且也得到了一个错误:(。
  • @Andrei 我不知道AoT import 是什么。

标签: javascript node.js vue.js webpack commonjs


【解决方案1】:

我认为问题在于您如何导入 FireBase

import firebase from 'firebase/app'

来自NPM website的文档

如果你使用带有 --experimental-modules 标志的原生 ES6 模块,你应该这样做: import firebase from 'firebase/app';

否则你应该像这样导入

const firebase = require('firebase');

【讨论】:

  • 您的意思是在firebase.js 文件中?如果是这样,我是否还需要module.exports?以及如何导入firebase/firestore?无论哪种方式,我认为节点可以使用 require 方法导入常规 javascript 文件。
  • 是的,当您导入regular js 文件时,它有自己的导入,由nodenode 处理,截至今天无法处理import firebase from 'firebase/app' 之类的导入
  • 这就是问题所在。谢谢。注意 - 对于任何可能需要它的人。我通过将代码从firebase.js 直接移动到gridsome-server.js 并使用commonsjs 语法解决了这个问题。
猜你喜欢
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 2019-01-31
  • 1970-01-01
  • 2019-05-21
  • 2020-04-12
  • 2017-10-05
相关资源
最近更新 更多