Реагировать - Ошибка при импорте зависимости, которая зависит от другой, уже находящейся в пакете. json - PullRequest
0 голосов
/ 09 января 2020

На моем package.json у меня есть эти зависимости:

"dependencies": {
    "@my-company-repository/componentXPTO": "19.8.5",
    "@my-company-repository/commonComponents": "18.0.2", 
    "react": "16.12.0",
    "react-dom": "16.12.0",
    "react-view-model": "^1.0.1",
    "react-virtualized": "9.21.0",
    "react-virtualized-tree": "3.1.0",
    "steal": "^2.1.11",

После npm install на node_modules, @my-company-repository/componentXPTO показывает наличие этих зависимостей:

"bundleDependencies": false,
"deprecated": false,
"peerDependencies": {
    "react": "^16.9.0",
    "react-dom": "^16.9.0"
},
"dependencies": {
    "@my-company-repository/commonComponents": "^17.44.6",
    "react-redux": "^5.1.1",
    "react-router-dom": "^4.3.1",
    "react-scripts": "^3.1.1",
    "redux": "^4.0.4",

И @my-company-repository/commonComponents имеют следующие данные:

"peerDependencies": {
    "react": "16.12.0",
    "react-dom": "16.12.0"
},

ПРИМЕЧАНИЕ. Мне нужны и @my-company-repository/componentXPTO, и @my-company-repository/commonComponents.

Затем я создал этот компонент, где я хочу использовать @my-company-repository/componentXPTO:

import React, { Component } from "react";
import FancyComponent from '@my-company-repository/componentXPTO';

class MyComponentWithFancyC extends Component {
  render() {
    return (
      <div className="my-container">
        <span>some text</span>
      </div>
    );
  }
}

export default MyComponentWithFancyC;

Если я прокомментирую строку import FancyComponent from '@my-company-repository/componentXPTO', все будет нормально. Но если я сохраню эту строку, я получу эту красную ошибку при доступе к своему новому компоненту в браузере:

steal.js:7348 Error: Unable to parse package.json for [react]
Unexpected token < in JSON at position 0

   1 | <!DOCTYPE html>
   2 | <html>
   3 |   <head lang="en">
   4 |     <meta charset="utf-8"/>
   5 |     <meta http-equiv="X-UA-Compatible" content="IE=EDGE"/>
   6 |     <link rel="icon" href="images/favicon.ico" type="image/x-icon"/>
   7 |     <link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon"/>
   8 |     <title>My Application</title>
   9 |     <style>
  10 |       .app-loading-spinner {
  11 |         background: url(./src/main/static/images/spinner.gif);
  12 |         height: 32px;
  13 |         width: 32px;
  14 |         position: fixed;
  15 |         top: 50%;
  16 |         left: 50%;
  17 |         z-index: 999999999;
  18 |       }
  19 | 
  20 |       .app-loading-spinner-container {
  21 |         position: fixed;
  22 |         top: 0;
  23 |         left: 0;
  24 |         height: 100%;
  25 |         width: 100%;
  26 |         background-color: rgba(255, 255, 255, 0.3);
  27 |         z-index: 999999999;
  28 |       }
  29 | 
  30 |       .hide-transition {
  31 |         -moz-transition: opacity 1s ease-in-out;
  32 |         -webkit-transition: opacity 1s ease-in-out;
  33 |         transition: opacity 1s ease-in-out;
  34 |         opacity: 0;
  35 |       }
  36 | 
  37 |       body {
  38 |         background-color: #d8dae0;
  39 |         height: 100%;
  40 |         margin: 0;
  41 |       }
  42 | 
  43 |       html {
  44 |         height: 100%;
  45 |       }
  46 | 
  47 |       div.browser-not-supported {
  48 |         width: 100%;
  49 |         text-align: center;
  50 |         padding-top: 100px;
  51 |         font-size: x-large;
  52 |         font-family: sans-serif;
  53 |       }
  54 |     </style>
  55 |   </head>
  56 |   <body>
  57 |     <div class="app-loading-spinner-container">
  58 |       <div class="app-loading-spinner">
  59 |       </div>
  60 |     </div>
  61 |     <div id="app" class="app"></div>
  62 |     <script src="node_modules/babel-polyfill/dist/polyfill.min.js"></script>
  63 |     <script src="./browser-conditional-renderer.js" environment="DEVELOPMENT"></script>
  64 | 
  65 |     <!-- Company Session Management -->
  66 |     <link rel="stylesheet" type="text/css" href="/sessionmanagement-web/css/sessionmanagement.css">
  67 |     <script type="text/javascript" src="/sessionmanagement-web/js/ApplicationSupervision.js"></script>
  68 |   </body>
  69 | </html>
  70 | 

    at parse (node_modules/@my-company-repository/componentXPTO/node_modules/react/package.json:0)

Кто-нибудь знает, в чем проблема?

Я уже удалил node_modules и снова установил его, и ошибка остается. Я уже создал новый пустой проект реагирования, в котором я использую только зависимость @my-company-repository/componentXPTO (без @my-company-repository/componentXPTO на package.json), и он отлично работает.

Понятия не имею, как решить эту проблему ...

1 Ответ

0 голосов
/ 14 января 2020

Я наконец понял.

Изначально кажется, что @my-company-repository/componentXPTO/node_modules/@my-company-repository/commonComponents вызывает проблему при поиске папки react в @my-company-repository/componentXPTO/node_modules/. Но react там не существует, потому что это peerDependency.

Так что мне нужно было переназначить это через Steal JS. Для этого в моем package.json я добавил конфигурацию Steal JS:

"steal": {
    "paths": {
      "@my-company-repository/componentXPTO/node_modules/react/*": "node_modules/react/*.js",
      "@my-company-repository/componentXPTO/node_modules/react-dom/*": "node_modules/react-dom/*.js"
    }

После этого возникли некоторые другие проблемы, но из-за наличия зависимости также как зависимости другой зависимости. Поэтому я удалил эту зависимость из другой зависимости. Для этого я создал файл postInstall.js в своей папке root со следующим кодом:

const pj = __dirname + "/node_modules/@my-company-repository/componentXPTO/package.json";
const contents = fs.readFileSync(pj);
const pkg = JSON.parse(contents);
delete pkg.dependencies["@my-company-repository/commonComponents"];
fs.writeFileSync(pj, JSON.stringify(pkg));

И затем я добавил в свой package.json скрипт для запуска этого нового кода после npm install:

"scripts": {
    "install": "node postInstall"

Теперь @my-company-repository/componentXPTO показывает наличие следующих зависимостей:

"bundleDependencies": false,
"deprecated": false,
"peerDependencies": {
    "react": "^16.9.0",
    "react-dom": "^16.9.0"
},
"dependencies": {
    "react-redux": "^5.1.1",
    "react-router-dom": "^4.3.1",
    "react-scripts": "^3.1.1",
    "redux": "^4.0.4",

А другие зависимости этого вида ищут react в папке моего проекта node_modules.

...