我有一个定制的UI库,它由Reaction和样式化组件组成,我已经在库的Package.json中指定使用我的主要应用程序样式化组件

  "peerDependencies": {
    "react": "^18.2.0",
    "nuka-carousel": "6.0.3",
    "styled-components": "6.0.8"
  },

but when i include the library in my app and run yarn install i noticed that it's installed in the library's node_moduleenter image description here

因此,在try 访问我的应用程序主题时,组件会中断

- error Error [TypeError]: Cannot read properties of undefined (reading 'h1')
    at /Users/user/Desktop/code/appclient/node_modules/ui-kit/lib/components/H1/styled/H1.js:16:36
    at ke (/Users/user/Desktop/code/appclient/node_modules/ui-kit/node_modules/styled-components/dist/styled-components.cjs.js:1:17838)
    at e.generateAndInjectStyles (/Users/user/Desktop/code/appclient/node_modules/ui-kit/node_modules/styled-components/dist/styled-components.cjs.js:1:19353)
    at /Users/user/Desktop/code/appclient/node_modules/ui-kit/node_modules/styled-components/dist/styled-components.cjs.js:1:21658
    at /Users/user/Desktop/code/appclient/node_modules/ui-kit/node_modules/styled-components/dist/styled-components.cjs.js:1:21771
    at I (/Users/user/Desktop/code/appclient/node_modules/ui-kit/node_modules/styled-components/dist/styled-components.cjs.js:1:21998)
    at renderWithHooks (/Users/user/Desktop/code/appclient/node_modules/react-dom/cjs/react-dom-server.browser.development.js:5658:16)
    at renderForwardRef (/Users/user/Desktop/code/appclient/node_modules/react-dom/cjs/react-dom-server.browser.development.js:5842:18)
    at renderElement (/Users/user/Desktop/code/appclient/node_modules/react-dom/cjs/react-dom-server.browser.development

如果我删除node_modules内的库中的styled-components

enter image description here

应用程序开始正常工作,因为它正在使用我的主应用程序的styled-components

enter image description here

如果我遗漏了什么可能导致问题的东西,请告诉我.如果有必要,我也可以提供更多的细节.谢谢!

编辑: 按要求添加库和我的主应用程序的json包

我的图书馆

{
  "name": "uikit",
  "version": "1.16.0",
  "description": "A collection of components",
  "main": "./lib/index.js",
  "resolutions": {
    "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.cd77847.0",
    "@babel/preset-env": "^7.22.10",
    "jackspeak": "2.1.1"
  },
  "scripts": {
    "compile:clean": "rimraf lib coverage",
    "compile": "tsc -m es6 --outDir lib-",
    "lint": "yarn run lint:eslint && yarn run lint:stylelint",
    "test:full": "yarn lint && yarn test:unit",
    "test:unit": "yarn jest",
    "storybook": "storybook dev -p 6006",
    "build-storybook": "storybook build",
    "release": "yarn compile:clean && yarn compile",
    "release:major": "yarn release && standard-version --release-as major",
    "release:minor": "yarn release && standard-version --release-as minor",
    "release:patch": "yarn release && standard-version --release-as patch",
    "release:alpha": "yarn release && standard-version --prerelease alpha",
    "start": "yarn storybook",
    "prepare": "husky install"
  },
  "keywords": [
    "components",
    "icons"
  ],
  "license": "MIT",
  "devDependencies": {
    "@babel/cli": "^7.22.10",
    "@babel/core": "^7.22.10",
    "@babel/eslint-parser": "^7.22.10",
    "@babel/eslint-plugin": "^7.22.10",
    "@babel/plugin-proposal-class-properties": "^7.18.6",
    "@babel/plugin-proposal-decorators": "^7.22.10",
    "@babel/plugin-proposal-export-default-from": "^7.22.5",
    "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
    "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
    "@babel/plugin-proposal-optional-chaining": "^7.21.0",
    "@babel/plugin-proposal-private-methods": "^7.18.6",
    "@babel/plugin-transform-runtime": "^7.22.10",
    "@babel/preset-env": "^7.22.10",
    "@babel/preset-react": "^7.22.5",
    "@babel/preset-typescript": "^7.22.5",
    "@babel/runtime": "^7.22.10",
    "@mdx-js/loader": "^2.1.3",
    "@storybook/addon-a11y": "^7.4.6",
    "@storybook/addon-actions": "^7.4.6",
    "@storybook/addon-docs": "^7.4.6",
    "@storybook/addon-essentials": "^7.4.6",
    "@storybook/addon-mdx-gfm": "^7.4.6",
    "@storybook/addon-storysource": "^7.4.6",
    "@storybook/addon-viewport": "^7.4.6",
    "@storybook/addons": "^7.4.6",
    "@storybook/react": "^7.4.6",
    "@storybook/react-webpack5": "^7.4.6",
    "@storybook/source-loader": "^7.4.6",
    "@storybook/theming": "^7.4.6",
    "@stylelint/postcss-css-in-js": "^0.38.0",
    "@types/body-scroll-lock": "^3.1.0",
    "@types/leaflet": "^1.9.0",
    "@types/lodash": "^4.14.195",
    "@types/luxon": "^3.2.0",
    "@types/node": "^20.8.6",
    "@types/react-motion": "^0.0.35",
    "@types/react-test-renderer": "^18.0.0",
    "@types/react-transition-group": "^4.4.5",
    "@types/shortid": "^0.0.30",
    "@typescript-eslint/eslint-plugin": "^5.45.1",
    "@typescript-eslint/parser": "^5.45.1",
    "autoprefixer": "^10.4.13",
    "babel-loader": "^9.1.0",
    "babel-plugin-module-resolver": "^5.0.0",
    "babel-plugin-styled-components": "^2.0.7",
    "css-loader": "^6.8.1",
    "eslint": "^8.24.0",
    "eslint-plugin-import": "^2.27.5",
    "eslint-plugin-jest-async": "^1.0.3",
    "eslint-plugin-jsx-a11y": "^6.7.1",
    "eslint-plugin-react": "^7.32.2",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-storybook": "^0.6.14",
    "husky": "^8.0.1",
    "identity-obj-proxy": "^3.0.0",
    "jest": "^29.1.2",
    "jsdom": "^22.0.0",
    "jsdom-global": "^3.0.2",
    "postcss": "^8.4.18",
    "postcss-syntax": "^0.36.2",
    "react": "^18.2.0",
    "rimraf": "^5.0.1",
    "sass": "^1.55.0",
    "sass-loader": "^13.3.2",
    "standard-version": "^9.5.0",
    "storybook": "^7.4.6",
    "style-loader": "^3.3.3",
    "stylelint": "^14.9.1",
    "stylelint-config-recommended-scss": "^8.0.0",
    "stylelint-config-standard": "^29.0.0",
    "stylelint-config-styled-components": "^0.1.1",
    "stylelint-processor-styled-components": "^1.9.0",
    "stylelint-scss": "^5.0.0",
    "typescript": "^5.2.2",
    "webpack": "^5.74.0",
    "webpack-cli": "^5.0.0"
  },
  "dependencies": {
    "@testing-library/jest-dom": "^6.0.0",
    "@testing-library/react": "^14.0.0",
    "@testing-library/user-event": "^14.4.3",
    "body-scroll-lock": "^4.0.0-beta.0",
    "downshift": "^6.1.12",
    "file-loader": "^4.1.0",
    "fuzzysort": "^2.0.1",
    "jasmine-reporters": "^2.5.0",
    "jest-environment-jsdom": "^29.1.2",
    "jest-fetch-mock": "^3.0.3",
    "jest-jasmine2": "^29.1.2",
    "jest-styled-components": "^7.1.1",
    "leaflet": "^1.8.0",
    "lodash": "^4.17.21",
    "luxon": "^3.0.4",
    "moment": "^2.29.4",
    "nuka-carousel": "6.0.3",
    "pluralize": "^8.0.0",
    "prop-types": "^15.8.1",
    "qs": "^6.11.2",
    "react-addons-shallow-compare": "^15.6.0",
    "react-autosuggest": "^10.0.2",
    "react-dates": "^21.8.0",
    "react-device-detect": "^2.2.2",
    "react-dom": "^18.2.0",
    "react-leaflet": "^4.0.2",
    "react-moment-proptypes": "^1.8.1",
    "react-motion": "^0.5.2",
    "react-test-renderer": "^18.2.0",
    "react-transition-group": "^4.4.5",
    "react-truncate-markup": "^5.1.2",
    "shortid": "^2.2.8",
    "styled-components": "6.0.8",
    "stylis": "^4.0.0",
    "uniqid": "^5.4.0"
  },
  "peerDependencies": {
    "react": "^18.2.0",
    "nuka-carousel": "6.0.3",
    "styled-components": "6.0.8"
  },
  "jest": {
    "moduleFileExtensions": [
      "jsx",
      "js",
      "ts",
      "tsx"
    ],
    "testEnvironment": "jsdom",
    "testRunner": "jest-jasmine2",
    "moduleNameMapper": {
      "\\.(css|scss)$": "identity-obj-proxy",
      "^.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js"
    },
    "testPathIgnorePatterns": [
      "/node_modules/",
      "/lib/"
    ],
    "collectCoverage": true,
    "verbose": true,
    "modulePathIgnorePatterns": [
      "rpmbuild"
    ],
    "roots": [
      "<rootDir>",
      "./src"
    ],
    "modulePaths": [
      "<rootDir>",
      "./src"
    ],
    "moduleDirectories": [
      "node_modules"
    ],
    "unmockedModulePathPatterns": [
      "<rootDir>/node_modules/react/",
      "<rootDir>/node_modules/react-dom/",
      "<rootDir>/node_modules/react-addons-test-utils/",
      "<rootDir>/node_modules/fbjs",
      "<rootDir>/node_modules/core-js",
      "<rootDir>/node_modules/jasmine-reporters"
    ],
    "setupFilesAfterEnv": [
      "<rootDir>/setupTests.js"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "yarn test"
    }
  }
}

我的主要应用程序

{
  "name": "appclient",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "clean:next": "node clean_next.js",
    "check:connection": "node check_connection.js",
    "clean:check:connection": "yarn run clean:next && yarn run check:connection",
    "dev": "yarn run clean:check:connection && NODE_ENV=development env-cmd next -p 3020",
    "dev:otel": "OTEL_ENADLED='true' yarn run dev",
    "build": "IS_BUILDING='true' NODE_ENV=production next build",
    "start": "IS_BUILDING='false' next start",
    "test": "NODE_ENV=test jest --coverage --testPathIgnorePatterns cypress/**",
    "load_test": "siege -c10 -i -t30M -f ./tests/load_test_locations.txt",
    "lint": "yarn run eslint && yarn run stylelint",
    "eslint": "$(yarn bin)/eslint --ext .js,.jsx,.ts,.tsx src/**",
    "stylelint": "$(yarn bin)/stylelint src/**",
    "prepare": "husky install"
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "stylelint"
    ]
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@apollo/client": "3.8.5",
    "@boiseitguru/cookie-cutter": "^0.2.1",
    "@cloudnative/health": "^2.1.2",
    "@cloudnative/health-connect": "^2.1.0",
    "@datadog/browser-rum": "^4.50.1",
    "@marvelapp/react-ab-test": "^3.1.0",
    "@opentelemetry/exporter-trace-otlp-http": "^0.44.0",
    "@opentelemetry/resources": "^1.17.1",
    "@opentelemetry/sdk-node": "^0.44.0",
    "@opentelemetry/sdk-trace-base": "^1.17.1",
    "@opentelemetry/semantic-conventions": "^1.17.1",
    "@optimizely/optimizely-sdk": "^4.10.0",
    "@researchgate/react-intersection-observer": "^1.3.4",
    "@stripe/react-stripe-js": "^2.3.1",
    "@stripe/stripe-js": "^2.1.7",
    "@testing-library/jest-dom": "^6.1.4",
    "@testing-library/react": "^14.0.0",
    "@testing-library/user-event": "^14.5.1",
    "@types/actioncable": "^5.2.9",
    "actioncable": "^5.2.8",
    "apollo-link": "^1.2.14",
    "apollo-link-rest": "^0.9.0",
    "array-move": "^4.0.0",
    "axios": "^0.27.2",
    "cypress-iframe": "^1.0.1",
    "cypress-wait-until": "^2.0.1",
    "deepmerge": "^4.3.1",
    "device": "^0.3.11",
    "dotenv": "^16.3.1",
    "uikit": "1.16.1",  // my custom package
    "formik": "^2.4.5",
    "graphql": "^15.8.0",
    "graphql-ruby-client": "^1.11.9",
    "html-react-parser": "^4.2.2",
    "intersection-observer": "^0.12.2",
    "isomorphic-fetch": "^3.0.0",
    "libphonenumber-js": "^1.10.47",
    "lodash": "^4.17.21",
    "lru-cache": "^10.0.1",
    "luxon": "^3.4.3",
    "moment": "^2.29.4",
    "next": "13.4.19",
    "next-api-middleware": "^2.0.1",
    "next-useragent": "^2.8.0",
    "nuka-carousel": "^5.5.1",
    "pino": "^8.16.0",
    "pluralize": "^8.0.0",
    "prop-types": "^15.8.1",
    "qs": "^6.11.2",
    "query-string": "^8.1.0",
    "react": "^18.2.0",
    "react-cropper": "^2.3.3",
    "react-dates": "^21.8.0",
    "react-device-detect": "^2.2.3",
    "react-dom": "^18.2.0",
    "react-dropzone": "^14.2.3",
    "react-google-login": "^5.2.2",
    "react-inlinesvg": "^4.0.5",
    "react-marquee-slider": "^1.1.5",
    "react-responsive-carousel": "^3.2.23",
    "react-router-dom": "^6.16.0",
    "react-scroll-to-component-ssr": "^1.0.0",
    "react-sortable-hoc": "^2.0.0",
    "react-spring": "^9.7.3",
    "react-table": "^7.8.0",
    "react-tooltip": "^5.21.5",
    "react-waypoint": "^10.3.0",
    "rxjs": "^7.8.1",
    "sharp": "^0.32.6",
    "styled-components": "^6.0.9",
    "stylis": "^4.0.0",
    "use-clipboard-copy": "^0.2.0",
    "util": "^0.12.5",
    "yup": "^1.3.2"
  },
  "devDependencies": {
    "@jest/globals": "^29.7.0",
    "@percy/cli": "^1.27.3",
    "@percy/cypress": "^3.1.2",
    "@stylelint/postcss-css-in-js": "^0.38.0",
    "@types/jest": "^29.5.5",
    "@types/lodash": "^4.14.199",
    "@types/query-string": "^6.3.0",
    "@typescript-eslint/eslint-plugin": "^5.62.0",
    "@typescript-eslint/parser": "^5.62.0",
    "axios-mock-adapter": "^1.22.0",
    "babel-jest": "^29.7.0",
    "cypress": "^13.3.1",
    "cypress-plugin-tab": "^1.0.5",
    "env-cmd": "^10.1.0",
    "eslint": "^8.51.0",
    "eslint-config-next": "13.4.19",
    "eslint-import-resolver-alias": "^1.1.2",
    "eslint-plugin-cypress": "^2.15.1",
    "eslint-plugin-es": "^4.1.0",
    "eslint-plugin-import": "^2.28.1",
    "eslint-plugin-optimize-regex": "^1.2.1",
    "husky": "^8.0.3",
    "jasmine-reporters": "^2.5.2",
    "jest": "^29.7.0",
    "jest-canvas-mock": "^2.5.2",
    "jest-cli": "^29.6.0",
    "jest-environment-jsdom": "^29.6.4",
    "jsdom": "^22.1.0",
    "lint-staged": "^14.0.1",
    "mochawesome": "^7.1.3",
    "mochawesome-merge": "^4.3.0",
    "postcss-styled": "^0.34.0",
    "postcss-styled-syntax": "^0.5.0",
    "postcss-syntax": "^0.36.2",
    "prettier-eslint": "^15.0.1",
    "react-test-renderer": "^18.2.0",
    "stylelint": "^15.10.3",
    "stylelint-config-recommended": "^13.0.0",
    "stylelint-config-standard": "^34.0.0",
    "stylelint-config-styled-components": "^0.1.1",
    "stylelint-processor-styled-components": "^1.10.0",
    "typescript": "^5.2.2",
    "webpack": "5.88.2"
  },
  "jest": {
    "testEnvironment": "jsdom",
    "moduleFileExtensions": [
      "jsx",
      "js",
      "ts",
      "tsx"
    ],
    "transform": {
      "^.+\\.(js|jsx|ts|tsx)$": [
        "babel-jest",
        {
          "presets": [
            "next/babel"
          ]
        }
      ]
    },
    "transformIgnorePatterns": [
      "node_modules/(?!(decode-uri-component|filter-obj|split-on-first|query-string)/)"
    ],
    "modulePaths": [
      "src",
      "."
    ],
    "setupFilesAfterEnv": [
      "<rootDir>/setupTests.js",
      "jest-canvas-mock"
    ]
  }
}

推荐答案

主应用程序中安装的样式化组件的版本与自定义库中存在的版本不同.

只需从自定义库依赖项中删除styled-component,并在自定义库peerDependencies中使用styled-component的宽松版本,如^6.0.0,如下所示:

  "peerDependencies": {
    "styled-components": "^6.0.0"
  }

如果您的定制库中使用了样式组件,只需将其添加到devDependencies而不是dependencies.

根据npm个博客和this post个博客:

与常规依赖项不同的是,对等依赖项要求应该宽松.您不应该将您的对等依赖项锁定到特定的修补程序版本.如果一个Chai插件依赖于Chai 1.4.1,而另一个依赖于Chai 1.5.0,那将是非常恼人的,因为作者很懒,没有花时间弄清楚他们兼容的Chai的实际最低版本.

如果您希望您的包使用与主应用程序相同的styled-component版本,请找到与您的应用程序兼容的较低版本的样式组件,并在peerDependencies中使用宽松的要求,这样样式组件就不会不必要地放入自定义库文件夹中

Typescript相关问答推荐

在React中实现具有独立页面的嵌套路径的最佳实践是什么?

无法将select选项的值设置为ngFor循环中的第一个元素

Angular 信号:当输入信号改变值时,S触发取数的正确方式是什么?

如何推断计算逻辑的类型

TypeScrip:逐个 case Select 退出noUncheck kedIndexedAccess

如果字符串文字类型是泛型类型,则用反引号将该类型括起来会中断

如何将所有props传递给React中的组件?

TS2339:类型{}上不存在属性消息

已解决:如何使用值类型限制泛型键?

使用2个派生类作为WeakMap的键

vue-tsc失败,错误引用项目可能无法禁用vue项目上的emit

在Cypress中,您能找到表格中具有特定文本的第一行吗?

在抽象类属性定义中扩展泛型类型

如何从JWT Reaction中提取特定值

在打印脚本中将对象类型转换为数组

类型脚本中函数重载中的类型推断问题

如何使对象同时具有隐式和显式类型

组件使用forwardRef类型脚本时传递props

在类型{}上找不到带有string类型参数的索引签名 - TypeScript

如何确定剧作家中给定定位器的值?