首页 > 解决方案 > webpack 4 - 在生产模式下找不到 /package.json

问题描述

我正在为一个简单的 web express 应用程序运行 webpack4 当我在开发环境中运行服务器(通过 nodemon)时,它运行良好,但是当我进入生产环境时,我收到了这个奇怪的错误(从 firestore 行生成) )

Error: package.json does not exist at /package.json

我不明白为什么它在根 (/) 目录而不是 dist 目录中寻找 package.json。

这是我的 webpack.config.js 文件:

// webpack.config.js

const path = require('path')
const webpack = require('webpack') // to access built-in plugins
// const nodeExternals = require('webpack-node-externals')
const CopyWebpackPlugin = require('copy-webpack-plugin')

const config = {
  mode: 'production',
  target: 'node',
  entry: './lib/index.js',
  // externals: [nodeExternals()], // in order to ignore all modules in node_modules folder
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'app.js',
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /(node_modules)/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        enforce: 'pre',
        test: /\.js$/,
        exclude: /(node_modules)/,
        loader: 'eslint-loader'
      },
      {
        test: /\.txt$/,
        exclude: /(node_modules)/,
        use: 'raw-loader'
      }
    ]
  },
  plugins: [
    new CopyWebpackPlugin([{ from: './lib/assets/lastest.txt' }, { from: './package.json' }]),
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': '"production"'
    }),
  ]
}

module.exports = config

任何想法我错过了什么?我在文档中看到了对 Resolvers 的引用,但默认情况下,它正在寻找 package.json 所以......

标签: webpackgoogle-cloud-firestorewebpack-4

解决方案


该问题来自 gRPC(firebase/firestore 的依赖项)的问题,该问题无法从 Windows 上的 node-pre-gyp(它的依赖项)找到绑定。因此,不要像这样导入 Firebase:

import firebase from 'firebase/app';

您需要通过创建 App Shell 使用这样的脚本标签来导入 firebase:

<script src="https://www.gstatic.com/firebasejs/5.10.0/firebase-app.js" />
<script src="https://www.gstatic.com/firebasejs/5.10.0/firebase-firestore.js" />

使用此解决方法,您可以将这些脚本缓存到用户的浏览器。但是,这只会在您的用户第一次进入您的网站时导致加载时间增加。除此之外,该网站实际上应该运行得一样快(甚至可能更快)。您甚至不需要费心创建外部 API(除非您愿意这样做)。要访问您的数据库,您可以执行一个简单的操作,firebase.firestore()...get()但请确保您的用户在尝试此类操作之前已在其缓存中安装了 Firebase,否则您将收到一条错误消息,指出这firebase.firestore()不是一个函数。


推荐阅读