【问题标题】:Compiling React projects in MonoRepo failing在 MonoRepo 中编译 React 项目失败
【发布时间】:2020-03-04 18:07:56
【问题描述】:

我正在尝试使用我的 docker 实例设置纱线工作区。这是我的目录结构:

/monorepo/
  /node_modules/
        @libs/common
        @services/common
        @services/project-A
        ...OTHER DEPS...
  package.json
  /services/
      /common/
         index.jsx
         package.json
      /project-A/  
           webpack.base.config.js
           **REACT project with babel, webpack, etc**

  /libs/
     /tools/
         /common/
            index.jsx
            package.json

为了简化我的 docker 设置,我刚刚在我的 docker compose 中配置了这个卷,它映射了整个 monorepo 目录:

volumes:
      - '../../../monorepo:/monorepo'

从那里在我的 Project-A 中导入 @libs/common 和 @services/common。当公共库导出简单的函数时,这很好用:

export const Add = (a,b) => a+b

Webpack 可以解决这个问题并构建 Project-A。

但是,当我尝试从这样的常用库之一导入组件时:

/libs/tools/common: 

      import React from 'react' 
      export MySharedComponent = () => <>HELLLO</>

我在构建过程中遇到错误:

 Error: Cannot find module '/monorepo/libs/tools/common/webpack.base.config.js'
Require stack:
- /monorepo/node_modules/eslint-import-resolver-webpack/index.js
- /monorepo/node_modules/eslint-module-utils/resolve.js
- /monorepo/node_modules/eslint-plugin-import/lib/rules/no-unresolved.js
- /monorepo/node_modules/eslint-plugin-import/lib/index.js

Project-A下的eslint文件:

{
    "parser": "babel-eslint",
    "env": {
      "browser": true,
      "node": true,
      "jest": true,
      "cypress/globals": true
    },
    "settings": {
      "import/resolver": {
        "webpack": {
          "config": "webpack.base.config.js"
        }
      }
    }
  }

Project-A下的babel.rc

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "current"
        }
      }
    ],
    "@babel/preset-react",
    "@babel/preset-flow"
  ],
  "env": {
    "test": {
      "plugins": [
        [
          "babel-plugin-webpack-alias",
          {
            "config": "./webpack.base.config.js"
          }
        ]
      ]
    }
  }
}

我的问题:

  • 主要问题是公共存储库中没有设置 webpack 配置。因此工作区不知道如何编译我的共享资源?

  • 我的工作空间中是否应该只有 1 个 webpack 构建配置供工作空间内的所有项目使用?目前我在 Project-A 下只有 1 个配置?

  • 如果我每个项目都有特定的 webpack 需求会发生什么,1 个配置(如果这是答案)有意义吗?

【问题讨论】:

    标签: javascript docker webpack lerna


    【解决方案1】:

    1) 首先,您的代码中有一行在babelrceslint 中都引用了webpack.base.config.js

    因此,如果该文件不存在,则表示未找到模块的错误是有意义的。

    2) 第二:如果您在相同的情况和环境中构建和使用您的存储库,是的,您可以为两者设置一个配置,但您可能需要为您的配置设置环境 (Development, Production) . 但是如果你真的想让你的依赖和配置分开,webpack 支持你的项目multiple entries,你可以检查一下。

    【讨论】:

    • 所以 webpack.base.config 确实存在,但它在 Project-A 中,但是我正在尝试捆绑依赖于 @libs/common 的“Project-A”,我收到一条错误消息webpack.base.config.js 不在@libs/common 之下。但是 webpack 不应该只使用来自Project-A 的配置我不认为多个条目是解决这个问题的方法。
    • 或者,如果您可以举一个有关条目的示例,可能有助于我理解您的意思。
    • @Batman 每次 webpack 想要加载您尝试导入的文件或模块时,它都会根据文件所在的目录将该文件传递给某种中间件。所以您的相对传递可能是错误的太 ("webpack.base.config.js") 。当然,多个条目并不能解决您的问题。我认为你不需要多个配置文件,但如果你想要的话,它会是一个案例。
    • 当你说我的相对通行证时,我相信你指的是我的babelrc 文件,我有"./webpack.base.config.js"?所以不是在project-a 下寻找webpack 配置,而是在寻找相对于libs/tools/common 的它?这是你的意思吗?
    • @Batman 假设您有 2 个独立的应用程序,它们具有不同的文件和文件夹,它们也有一个公共共享库,您创建 2 个 webpack 条目,将共享模块放在共享文件夹中,并且两个条目都使用该共享库。您可以搜索详细信息。
    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 2021-06-14
    • 1970-01-01
    • 2019-08-02
    • 2017-07-29
    • 2017-07-25
    • 1970-01-01
    • 2018-05-29
    相关资源
    最近更新 更多