Недопустимый вызов подключения в npm свяжет библиотеку с приложением

#reactjs #npm #webpack

Вопрос:

Неверный вызов крючка. Крючки могут вызываться только внутри тела функционального компонента. Это может произойти по одной из следующих причин: 1. У вас могут быть несоответствующие версии React и er визуализации (например, React DOM) 2. Вы можете нарушать правила крючков 3. У вас может быть несколько копий React в одном приложении.

Я разрабатываю собственную библиотеку компонентов и использую ту же библиотеку в своем приложении по npm ссылке, но при тестировании получаю ошибку выше.

вот мой webpack.config

 const path = require('path');

module.exports = {
    entry: './src/index.ts',
    devtool: 'eval-source-map',
    module: {
        rules: [
            {
                // "oneOf" will traverse all following loaders until one will
                // match the requirements. When no loader matches it will fall
                // back to the "file" loader at the end of the loader list.
                oneOf: [
                    {
                        test: /.(tsx|ts|mjs)$/,
                        exclude: /node_modules/,
                        use: {
                            loader: 'babel-loader',
                            options: {
                                plugins: [['@babel/plugin-proposal-class-properties'], ['@babel/plugin-transform-runtime', { "regenerator": true }]],
                                presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-typescript'],
                            },
                        },
                    },
                    
                    {
                        test: /.mjs$/,
                        use: {
                            loader: 'babel-loader',
                            options: {
                                presets: ['@babel/preset-env'],
                            },
                        },
                    },
                    {
                        test: /.(css|scss)$/,
                        use: [{ loader: 'style-loader' }, { loader: 'css-loader' }, { loader: 'sass-loader' }],
                    },
                    // "url" loader works like "file" loader except that it embeds assets
                    // smaller than specified limit in bytes as data URLs to avoid requests.
                    // A missing `test` is equivalent to a match.
                    {
                        exclude: [/.js$/, /.ts$/, /.html$/, /.json$/],
                        loader: require.resolve('url-loader'),
                        options: {
                            limit: 10000,
                            name: 'static/media/[name].[hash:8].[ext]',
                        },
                    },
                ],
            },
        ],
    },
    resolve: {
        extensions: ['.mjs', '.js', '.ts', '.tsx', '.json'],
    },
    output: {
        path: path.resolve(__dirname, 'dist/'),
        publicPath: '',
        filename: 'bundle.js',
        libraryTarget: 'commonjs'
    }
};
 

вот мой пакет.json

 {
  "name": "abc",
  "version": "1.0.42",
  "description": "A React component library",
  "main": "dist/bundle.js",
  "types": "dist/types/index.d.ts",
  "scripts": {
    "test": "jest",
    "build:development": "npm-run-all --parallel webpack:watch generate-typings",
    "build:production": "npm-run-all webpack:prod generate-typings",
    "build:clean": "rmdir /Q /S dist",
    "generate-typings": "tsc --declaration --emitDeclarationOnly",
    "styleguide": "npx styleguidist server",
    "styleguide:build": "npx styleguidist build",
    "webpack:watch": "webpack --watch --mode=development",
    "webpack:prod": "webpack --mode=production",
    "localVersion": "node -p "require('./package.json').version"> localVersion.txt",
    "serverVersion": "npm view @company/abc version > serverVersion.txt"
  },
  "repository": {
    "type": "git",
    "url": "url"
  },
  "keywords": [
    "react",
    "components",
    "typescript"
  ],
  "author": "Spencer Cousino",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.11.1",
    "@babel/plugin-proposal-class-properties": "^7.10.4",
    "@babel/preset-env": "^7.11.0",
    "@babel/preset-react": "^7.10.4",
    "@babel/preset-typescript": "^7.10.4",
    "@fortawesome/fontawesome-svg-core": "^1.2.28",
    "@fortawesome/free-solid-svg-icons": "^5.13.0",
    "@types/enzyme": "^3.10.5",
    "@types/fetch-mock": "^7.3.2",
    "@types/jest": "^24.9.1",
    "@types/nock": "^10.0.3",
    "@types/node": "^11.15.9",
    "@types/react": "^16.9.0",
    "@types/react-dom": "^16.9.0",
    "@types/react-table": "^6.8.7",
    "async-wait-until": "^1.2.4",
    "babel-loader": "^8.1.0",
    "css-loader": "^1.0.1",
    "enzyme": "^3.11.0",
    "enzyme-adapter-react-16": "^1.15.2",
    "fetch-mock": "^7.7.3",
    "file-loader": "^3.0.1",
    "identity-obj-proxy": "^3.0.0",
    "jest": "^25.3.0",
    "nock": "^10.0.6",
    "node-fetch": "^2.6.1",
    "node-sass": "^4.14.1",
    "npm-run-all": "^4.1.5",
    "oidc-client": "^1.10.1",
    "powerbi-report-component": "^1.6.0",
    "prettier": "1.17.0",
    "react": "^16.14.0",
    "react-docgen-typescript": "^1.20.1",
    "react-dom": "^16.14.0",
    "react-router": "^5.1.2",
    "react-router-dom": "^5.1.2",
    "react-table": "6.10.3",
    "react-slick": "^0.23.2",
    "react-spinners": "^0.9.0",
    "react-styleguidist": "^11.1.5",
    "reactstrap": "^8.4.1",
    "sass-loader": "^7.3.1",
    "ts-jest": "^25.4.0",
    "typescript": "^3.8.3",
    "url-loader": "^1.1.2",
    "webpack": "^4.44.1",
    "webpack-cli": "^3.3.12"
  },
  "dependencies": {
    "@babel/plugin-transform-runtime": "^7.12.1",
    "@babel/runtime": "^7.12.5",
    "@company/abc": "0.0.6",
    "@company/abc1": "^1.2.0",
    "@company/abc2": "^1.0.23",
    "@company/abc3": "^1.9.1",
    "@company/abc4": "^1.0.1",
    "core-js": "^3.8.0",
    "date-fns": "^1.30.1",
    "react-bingmaps": "^3.6.1",
    "react-bootstrap": "^0.32.3",
    "react-grid-layout": "^0.16.6",
    "react-scripts": "^4.0.3",
    "react-tabs": "^3.1.1",
    "slick-carousel": "^1.8.1"
  },
  "peerDependencies": {
    "react": "~16.8.4",
    "react-dom": "~16.8.4",
    "@types/node": "^11.11.6",
    "node-fetch": "^2.3.0",
    "oidc-client": "^1.7.0",
    "powerbi-report-component": "^1.1.3",
    "@fortawesome/fontawesome-svg-core": "^1.2.17",
    "@fortawesome/free-solid-svg-icons": "^5.8.1",
    "react-slick": "^0.23.2",
    "react-spinners": "^0.5.3",
    "reactstrap": "^8.0.0"
  },
  "jest": {
    "transform": {
      "^. \.tsx?$": "ts-jest"
    },
    "setupFilesAfterEnv": [
      "./testSetup.ts"
    ],
    "moduleNameMapper": {
      "^. \.(css|scss)$": "identity-obj-proxy",
      "^. \.(svg)$": "<rootDir>/src/mocks/fileMock.js"
    },
    "moduleFileExtensions": [
      "js",
      "jsx",
      "ts",
      "tsx"
    ],
    "collectCoverageFrom": [
      "**/context-components/**/*.{js,jsx,ts,tsx}"
    ]
  }
}
 

Я перепробовал несколько способов, но ни один из них не сработал для меня.
Любая помощь будет оценена по достоинству.

Комментарии:

1. Можете ли вы также поделиться кодом, в котором возникает ошибка?

2. <Modal modalRootId=’appRoot’ isOpen={true} CloseHandle={() => {}} заголовок=»Заголовок» <Modal modalRootId=’appRoot’ isOpen={true} CloseHandle={() =>> <Modal modalRootId=’appRoot’ isOpen={true} CloseHandle={() =>><Имя класса div=»releaseLock-сообщение-div»>{(«Предупреждение»)}<имя класса div=»releaseLock-сообщение-div»></div> </div></Modal> Ошибка получения для этого компонента, который находится в одной из библиотек.

3. Я не использую никаких крючков в своей библиотеке. На самом деле работа с компонентами класса не является функциональным компонентом. Но крючки используются в другой библиотеке, на которую я ссылаюсь при разработке своей библиотеки.

4. Тогда это ваша проблема. Весь javascript переносится, поэтому вам следует использовать пакет, поддерживающий вашу версию React, или обновить версию React

Ответ №1:

Крючки могут быть вызваны либо внутри компонента react, либо в пользовательском крючке. Любая функция является компонентом реакции, если она возвращает некоторые jsx .
Есть некоторые правила, react когда дело доходит до hooks . Правила о крючках реакции.
если вы хотите прочитать о пользовательских крючках, прочитайте о пользовательских крючках здесь.