ReactJS: ошибка импорта символических ссылок: сбой анализа модуля: неожиданный токен: вам может потребоваться соответствующий загрузчик для обработки этого типа файлов - PullRequest
2 голосов
/ 31 марта 2020

Я пишу библиотеку компонентов React, которую я хочу использовать в других проектах без особых затрат (bit, create-Reaction-library, generact, et c.) И без публикации. Я хочу использовать npm install ../shared_lib, чтобы добавить его в свой проект в качестве символической ссылки в /node_modules. Эта команда добавляет символическую ссылку к проекту node_modules. В моей папке shared_lib просто есть тест на export default a <div></div>:

import React from 'react';

const TryTest = function() {
  return (
    <div>
      TryTest
    </div>
  )
}

export default TryTest;

Проблема, с которой я сталкиваюсь, заключается в следующей ошибке при импорте компонента в мой рабочий project:

import TryTest from 'shared_lib';

Ошибка:

ERROR in ../shared_lib/src/index.js 6:4
Module parse failed: Unexpected token (6:4)
You may need an appropriate loader to handle this file type.
| const TryTest = function() {
|   return (
>     <div>
|       TryTest
|     </div>
 @ ./src/App.js 27:0-33 28:12-19
 @ ./src/index.js
 @ multi babel-polyfill ./src/index.js

Если я импортирую что-либо из shared_lib, кроме файла с jsx - например, строку или функцию, et c , - все работает нормально.

РЕДАКТИРОВАТЬ: в веб-пакете приложения есть разрешение символических ссылок объекта, установленное в false:

  resolve: {
    symlinks: false
  },

РЕДАКТИРОВАТЬ: После применения решения в ответе ниже ({ ссылка }) я позже изменил символические ссылки prop обратно на true. Мне не нужно было устанавливать значение false, чтобы решение работало и отображало shared_lib компонентов.


Загрузчик моего приложения:

{
  test: /\.jsx?$/,
  include: [
    path.join( __dirname, 'src'), // app/src
    fs.realpathSync(__dirname + '/node_modules/shared_lib'), // app/node_modules/shared_lib/dist/shared_lib.js
  ],
  exclude: /node_modules/,
  use: [ 'babel-loader' ]
}

РЕДАКТИРОВАТЬ: Когда я применил решение в ответе ниже, загрузчик теперь выглядит следующим образом:

{
  test: /\.jsx?$/,
  include: [
    path.join( __dirname, 'src'), // app/src
    fs.realpathSync(__dirname + '/node_modules/shared_lib'), // app/node_modules/shared_lib/dist/shared_lib.js
  ],
  exclude: /node_modules/,
  use: [ {
          loader: 'babel-loader',
          options: require("./package.json").babel
          }
        ]
}

Текущие настройки приложения .babelr c (я также пытался удалить .babelr c и включая предустановки в пакете. json с тем же результатом):

{
  "presets": [ "@babel/preset-react", "@babel/preset-env"]
}

** РЕДАКТИРОВАТЬ: После применения решения в ответе ниже я закончил тем, что вставил предустановки babel обратно в package.json.

"babel": {
    "presets": [
      "@babel/preset-react",
      "@babel/preset-env"
    ]
},

Я исследовал , в то время как , чтобы найти решение этой проблемы, и, по-видимому, в веб-пакете есть проблемы, связанные с компонентами реагирующих компонентов? Я не использую create-реагировать-приложение. Итак, я попытался связать shared_lib перед его импортом в проект, просто чтобы посмотреть, что произойдет. Вот последняя конфигурация веб-пакета (я пробовал и другие конфигурации):

const pkg = require('./package.json');
const path = require('path');
const buildPath = path.join( __dirname, 'dist' );
const clientPath = path.join( __dirname, 'src');
const depsPath = path.join( __dirname, 'node_modules');
const libraryName = pkg.name;

module.exports = [
  'cheap-module-source-map'
].map( devtool => ({
  bail: true,
  mode: 'development',
  entry: {
    lib : [ 'babel-polyfill', path.join( clientPath, 'index.js' ) ]
  },
  output: {
    path: buildPath,
    filename: 'shared_lib.js',
    libraryTarget: 'umd',
    publicPath: '/dist/',
    library: libraryName,
    umdNamedDefine: true
  },
  // to avoid bundling react
  externals: {
    'react': {
        commonjs: 'react',
        commonjs2: 'react',
        amd: 'React',
        root: 'React'
    }
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        include: [
          clientPath
        ],
        exclude: /node_modules/,
        use: [ 'babel-loader' ],
      },
    ]
  },
  devtool,
  optimization: {
    splitChunks: {
      chunks: 'all',
    },
  }
}));

И пакет. json для shared_lib

{
  "name": "shared_lib",
  "version": "1.0.0",
  "description": "",
  "main": "dist/shared_lib.js",
  "scripts": {
    "clean": "rm -rf dist/",
    "build": "$(npm bin)/webpack --config ./webpack.config.js",
    "prepublish": "npm run clean && npm run build"
  },
  "author": "",
  "license": "ISC",
  "peerDependencies": {
    "react": "^16.8.6"
  },
  "devDependencies": {
    "react": "^16.8.6",
    "@babel/core": "^7.9.0",
    "@babel/preset-env": "^7.9.0",
    "@babel/preset-react": "^7.9.4",
    "babel-loader": "^8.1.0",
    "babel-polyfill": "^6.26.0",
    "webpack": "^4.42.1",
    "webpack-cli": "^3.3.11"
  },
  "babel": {
    "presets": [
      "@babel/preset-react",
      "@babel/preset-env"
    ]
  }
}

Пакет упакован без ошибок: enter image description here

enter image description here

Когда я пытаюсь импортировать компонент таким же образом:

import TryTest from 'shared_lib';

enter image description here

Файл console.log возвращает undefined.

enter image description here

Путь к библиотеке с файлом в моем приложении все в порядке, потому что если я удалю все в shared_lib/dist/shared_lib.js и просто напишу export default 1, console.log(TryTest) в моем App.js вернет 1.

Я попытался изменить свойство libraryTarget в shared_lib/webpack.config до libraryTarget: 'commonjs'. Результат console.log(TryTest) становится {shared_lib: undefined}.

enter image description here

Кто-нибудь когда-нибудь сталкивался с этим?

1 Ответ

1 голос
/ 02 апреля 2020

Я нашел то, что наконец-то сработало для меня, и отрисовал символическую ссылку shared_lib в приложении.

Этот ответ: https://github.com/webpack/webpack/issues/1643#issuecomment -552767686

Хорошо отработанный рендеринг символические shared_lib компоненты. Я не обнаружил каких-либо недостатков в использовании этого решения, но пока оно работает единственно.

...