未捕获类型错误:无法确定当前节点版本

问题描述 投票:0回答:2

我将一个大型组件库与 webpack 捆绑在一起,并导出到一个文件,然后我尝试在我的 React 应用程序中测试该文件。 webpack 输出文件没有问题。当我运行 npm link 并模拟模块导入时,问题出现了。

我可以在开发中启动,只需导入我的本地组件即可。

从“./components”导入{App}; // 工作正常 从“testlib”导入{App}; // 抛出错误

我确定我在 webpack 中做错了什么,只是不知道是什么。任何帮助将不胜感激。

请参阅下面的错误:

caught TypeError: Unable to determine current node version
    at index.js:50:1
    at e.exports (index.js:63:1)
    at 1200 (core.js:7:1)
    at i (bootstrap:25:1)
    at 6313 (index.js:2:1)
    at i (bootstrap:25:1)
    at 4959 (index.js:5:1)
    at i (bootstrap:25:1)
    at 892 (macro.js:1:1)
    at i (bootstrap:25:1)

我已经确认它来自这个代码片段(我很确定这是来自 React 开发服务器),我只是不知道如何修复它:

'use strict';

var has = require('has');

function specifierIncluded(current, specifier) {
    var nodeParts = current.split('.');
    var parts = specifier.split(' ');
    var op = parts.length > 1 ? parts[0] : '=';
    var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.');

    for (var i = 0; i < 3; ++i) {
        var cur = parseInt(nodeParts[i] || 0, 10);
        var ver = parseInt(versionParts[i] || 0, 10);
        if (cur === ver) {
            continue; // eslint-disable-line no-restricted-syntax, no-continue
        }
        if (op === '<') {
            return cur < ver;
        }
        if (op === '>=') {
            return cur >= ver;
        }
        return false;
    }
    return op === '>=';
}

function matchesRange(current, range) {
    var specifiers = range.split(/ ?&& ?/);
    if (specifiers.length === 0) {
        return false;
    }
    for (var i = 0; i < specifiers.length; ++i) {
        if (!specifierIncluded(current, specifiers[i])) {
            return false;
        }
    }
    return true;
}

function versionIncluded(nodeVersion, specifierValue) {
    if (typeof specifierValue === 'boolean') {
        return specifierValue;
    }

    var current = typeof nodeVersion === 'undefined'
        ? process.versions && process.versions.node
        : nodeVersion;

    if (typeof current !== 'string') {
        throw new TypeError(typeof nodeVersion === 'undefined' ? 'Unable to determine current node version' : 'If provided, a valid node version is required');
    }

    if (specifierValue && typeof specifierValue === 'object') {
        for (var i = 0; i < specifierValue.length; ++i) {
            if (matchesRange(current, specifierValue[i])) {
                return true;
            }
        }
        return false;
    }
    return matchesRange(current, specifierValue);
}

var data = require('./core.json');

module.exports = function isCore(x, nodeVersion) {
    return has(data, x) && versionIncluded(nodeVersion, data[x]);
};

请参阅下面的配置文件:

webpack.config.js

const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const nodeExternals = require("webpack-node-externals");
const path = require("path");
const webpack = require("webpack");

module.exports = {
    entry: {
        "my-lib": "./src/components/index.ts",
        "my-lib.min": "./src/components/index.ts",
    },
    devtool: "source-map",
    plugins: [
        new UglifyJsPlugin({
            // minimize: true,
            // sourceMap: true,
            include: /\.min\.js$/,
        }),
        new webpack.ProvidePlugin({
            process: "process/browser",
        }),
    ],
    module: {
        rules: [
            {
                test: /\.(ts|tsx)?$/,
                loader: "ts-loader",
                exclude: /node_modules/,
            },
            {
                test: /\.css$/,
                use: ["style-loader", "css-loader"],
            },
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/i,
                type: "asset/resource",
            },
        ],
    },
    output: {
        path: path.resolve(__dirname, "dist"),
        filename: "index.js",
        libraryTarget: "umd",
    },
    resolve: {
        extensions: [".ts", ".tsx", ".js", ".jsx"],
        fallback: {
            vm: false,
            process: false,
            v8: false,
            perf_hooks: false,
            tty: false,
            os: false,
            module: false,
            assert: false,
            util: false,
            fs: false,
            tls: false,
            net: false,
            path: false,
            zlib: false,
            http: false,
            https: false,
            stream: false,
            crypto: false,
            url: false,
            "crypto-browserify": false,
        },
    },
    //externals: [nodeExternals()],
};

tsconfig.json

{
    "compilerOptions": {
        "allowImportingTsExtensions": false,
        "outDir": "lib",
        "sourceMap": true,
        "declaration": false,
        "target": "es5",
        "lib": ["dom", "dom.iterable", "esnext"],
        "allowJs": true,
        "skipLibCheck": true,
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "strict": true,
        "forceConsistentCasingInFileNames": true,
        "noFallthroughCasesInSwitch": true,
        "module": "ESNext",
        "moduleResolution": "node",
        "resolveJsonModule": true,
        "isolatedModules": true,
        "noEmit": false,
        "jsx": "react-jsx",
        "noImplicitAny": false
    },
    "include": ["src/components"]
}

package.json

{
    "name": "testlib",
    "version": "0.1.0",
    "private": true,
    "main": "dist/index.js",
    "files": [
        "dist"
    ],
    "engines": {
        "npm": ">=8.0.0",
        "node": ">=18.0.0"
    },
    "dependencies": {
        "@emotion/react": "^11.10.6",
        "@emotion/styled": "^11.10.6",
        "@fortawesome/fontawesome-svg-core": "^6.4.0",
        "@fortawesome/free-brands-svg-icons": "^6.4.0",
        "@fortawesome/free-regular-svg-icons": "^6.4.0",
        "@fortawesome/free-solid-svg-icons": "^6.4.0",
        "@fortawesome/react-fontawesome": "^0.2.0",
        "@material-ui/core": "^4.12.4",
        "@monaco-editor/react": "^4.5.0",
        "@mui/material": "^5.12.1",
        "body-scroll-lock": "^4.0.0-beta.0",
        "process": "^0.11.10",
        "react-animations": "^1.0.0",
        "react-burger-menu": "^3.0.9",
        "react-grid-layout": "^1.3.4",
        "react-refresh": "^0.11.0",
        "react-spinners": "^0.13.8",
        "react-vertical-timeline-component": "^3.6.0",
        "reactive-button": "^1.3.13",
        "twin.macro": "^3.3.1",
        "universal-cookie": "^4.0.4"
    },
    "scripts": {
        "start": "react-scripts start",
        "tsc": "tsc && tsc --build tsconfig.json -m es6 --outDir lib-esm",
        "webpack": "webpack",
        "builder": "shx rm -rf dist lib lib-esm && tsc && tsc -m es6 --outDir lib-esm && webpack && shx rm -rf lib lib-esm",
        "build": "react-scripts build",
        "test": "react-scripts test",
        "link-test": "npm run builder && npm unlink arclightui3 && cd dist && npm link && cd .. && npm link arclightui3 && npm start"
    },
    "eslintConfig": {
        "extends": [
            "react-app",
            "react-app/jest"
        ]
    },
    "browserslist": {
        "production": [
            ">0.2%",
            "not dead",
            "not op_mini all"
        ],
        "development": [
            "last 1 chrome version",
            "last 1 firefox version",
            "last 1 safari version"
        ]
    },
    "devDependencies": {
        "@babel/core": "^7.16.0",
        "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
        "@svgr/webpack": "^5.5.0",
        "@testing-library/jest-dom": "^5.16.5",
        "@testing-library/react": "^13.4.0",
        "@testing-library/user-event": "^13.5.0",
        "@types/jest": "^27.5.2",
        "@types/node": "^16.18.23",
        "@types/react": "^18.0.37",
        "@types/react-dom": "^18.0.11",
        "babel-jest": "^27.4.2",
        "babel-loader": "^8.2.3",
        "babel-plugin-named-asset-import": "^0.3.8",
        "babel-preset-react-app": "^10.0.1",
        "bfj": "^7.0.2",
        "browserify-fs": "^1.0.0",
        "browserslist": "^4.18.1",
        "camelcase": "^6.2.1",
        "case-sensitive-paths-webpack-plugin": "^2.4.0",
        "css-loader": "^6.5.1",
        "css-minimizer-webpack-plugin": "^3.2.0",
        "dotenv": "^10.0.0",
        "dotenv-expand": "^5.1.0",
        "eslint": "^8.3.0",
        "eslint-config-react-app": "^7.0.1",
        "eslint-webpack-plugin": "^3.1.1",
        "file-loader": "^6.2.0",
        "fs-extra": "^10.0.0",
        "html-webpack-plugin": "^5.5.1",
        "identity-obj-proxy": "^3.0.0",
        "jest": "^27.4.3",
        "jest-resolve": "^27.4.2",
        "jest-watch-typeahead": "^1.0.0",
        "mini-css-extract-plugin": "^2.4.5",
        "postcss": "^8.4.4",
        "postcss-flexbugs-fixes": "^5.0.2",
        "postcss-loader": "^6.2.1",
        "postcss-normalize": "^10.0.1",
        "postcss-preset-env": "^7.0.1",
        "prompts": "^2.4.2",
        "react": "^18.2.0",
        "react-app-polyfill": "^3.0.0",
        "react-dev-utils": "^12.0.1",
        "react-dom": "^18.2.0",
        "react-scripts": "^5.0.1",
        "resolve": "^1.20.0",
        "resolve-url-loader": "^4.0.0",
        "sass-loader": "^12.3.0",
        "semver": "^7.3.5",
        "shx": "^0.3.4",
        "socket.io-client": "^4.6.1",
        "source-map-loader": "^3.0.0",
        "style-loader": "^3.3.1",
        "styled-components": "^5.3.9",
        "tailwindcss": "^3.0.2",
        "terser-webpack-plugin": "^5.2.5",
        "ts-loader": "^9.4.2",
        "typescript": "^5.0.4",
        "uglifyjs-webpack-plugin": "^2.2.0",
        "web-vitals": "^2.1.4",
        "webpack": "^5.79.0",
        "webpack-cli": "^5.0.1",
        "webpack-dev-server": "^4.13.3",
        "webpack-manifest-plugin": "^4.0.2",
        "webpack-node-externals": "^3.0.0",
        "workbox-webpack-plugin": "^6.4.1"
    },
    "jest": {
        "roots": [
            "<rootDir>/src"
        ],
        "collectCoverageFrom": [
            "src/**/*.{js,jsx,ts,tsx}",
            "!src/**/*.d.ts"
        ],
        "setupFiles": [
            "react-app-polyfill/jsdom"
        ],
        "setupFilesAfterEnv": [
            "<rootDir>/src/setupTests.ts"
        ],
        "testMatch": [
            "<rootDir>/src/**/__tests__/**/*.{js,jsx,ts,tsx}",
            "<rootDir>/src/**/*.{spec,test}.{js,jsx,ts,tsx}"
        ],
        "testEnvironment": "jsdom",
        "transform": {
            "^.+\\.(js|jsx|mjs|cjs|ts|tsx)$": "<rootDir>/config/jest/babelTransform.js",
            "^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",
            "^(?!.*\\.(js|jsx|mjs|cjs|ts|tsx|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
        },
        "transformIgnorePatterns": [
            "[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs|cjs|ts|tsx)$",
            "^.+\\.module\\.(css|sass|scss)$"
        ],
        "modulePaths": [],
        "moduleNameMapper": {
            "^react-native$": "react-native-web",
            "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy"
        },
        "moduleFileExtensions": [
            "web.js",
            "js",
            "web.ts",
            "ts",
            "web.tsx",
            "tsx",
            "json",
            "web.jsx",
            "jsx",
            "node"
        ],
        "watchPlugins": [
            "jest-watch-typeahead/filename",
            "jest-watch-typeahead/testname"
        ],
        "resetMocks": true
    },
    "babel": {
        "presets": [
            "react-app"
        ]
    }
}
reactjs typescript webpack browser
2个回答
0
投票

我在使用“twin.macro”时遇到了类似的错误。

在我的 webpack 配置文件中,我对“.jsx”文件使用“babel-loader”,对“.tsx”文件使用“ts-loader”。

我通过使用“babel-loader”处理“.jsx”和“.tsx”文件来修复错误,如下所示:

{
    test: /\.[jt]sx?$/,
    exclude: /node_modules/,
    use: ["babel-loader"],
}

这并不理想,因为我将“ts-loader”与“fork-ts-checker-webpack-plugin”一起使用来减少编译时间。但对我来说,能够使用“双宏”更重要,所以......


0
投票

我也有同样的问题。安迪有更新吗?

© www.soinside.com 2019 - 2024. All rights reserved.