3

所以我正在lerna为我们的反应应用程序尝试 monorepo 设计。这个想法是创建一个 repo,它将所有的 react 项目作为lerna包以及一些在应用程序之间共享的通用模块/组件。

现在所有这些通用模块/组件都是 es6 模块。没有被转译。因为公共模块也在不断发展。如果我们构建/转换它们,我确信在那之后反应 HMR 将不起作用(一个疯狂的猜测)。以下是我的目录结构

package.json lerna.json |--packages |--common |--react-app |--constants |--utilities

commontable,accordion包含作为默认 es6 模块导出的常见反应元素等。

react-app导入commondependency. react-app有 webpack 构建配置集。

现在当我将common模块导入我的react-appbabeltransform失败并出现此错误

Button.component.jsx 7:19
Module parse failed: Unexpected token (7:19)
You may need an appropriate loader to handle this file type.
| const { Search } = Input;
| class TextBoxWithButton extends React.Component {
>   static propTypes = {
|     placeholder: PropTypes.string.isRequired,
|     onAction: PropTypes.func.isRequired,
 @ ./src/App/Modules/Todo/Components/Header/Header.component.jsx 10:0-111 16:25-41
 @ ./src/App/Modules/Todo/Todo.component.jsx
 @ ./src/App/Router/index.jsx
 @ ./src/App/Layout/index.jsx
 @ ./src/App/index.jsx
 @ ./src/App.hot.js
 @ ./src/index.jsx

这意味着babel-loader无法解析和转译node_nodules文件夹中的内容,这是有道理的,因为所有依赖项都应该已经转译。但不总是。如果您管理本地依赖项,则无法始终构建它们(这就是我的想法)

现在我在网上找到了一些解决方案,使 1在排除正则表达式中bable-loader不排除node_modules或忽略@mypackage。但在我的情况下没有任何效果。

这是我到目前为止所尝试的。

  1. exlucde: /node_modules/babel-loader=>中删除不工作
  2. 使用require.resolve('babel-loader')=> 不工作
  3. 添加resolve.symlinks= false.
  4. 添加resolve.modules='node_modules'path.resove(__dirname,'node_modules')=> 不工作
  5. babel-loader添加要包含的包路径include: [srcPath, lernaPackagesPath]

似乎没有任何效果。有什么我想念的吗? 是我的 git test repo 的链接。

4

1 回答 1

4

babel-loader默认情况下不会转译node_modules. 您可以明确说明要转换的内容,node_modules但之后@babel7.0.0似乎也不起作用。还.babelrc介绍了一个范围@babel7.0.0

根据我在正常情况下所做的研究,node_modules期望已经编译commonjsumd模块。可以由任何应用程序导入。在我的情况下,我的包/组件es6需要转换所有模块。我的 webpack 构建失败了,因为babel-loader只是忽略了它们。

所以我决定使用@babel/cli转译我的组件所在的每个包,我必须将.babelrc其他配置与其他配置一起添加到我的组件包中并使用@babel/cli

这是scripts我的package.json

"scripts": {
    "start": "babel src --watch --out-dir dist --source-maps inline --copy-files --ignore spec.js,spec.jsx"
  },

之后我的 package.json 看起来像这样

{
  "name": "@pkg/components",
  "version": "1.0.1",
  "description": "a repository for react common components. may or may not be dependent on elements",
  "main": "dist/index.js",
  "author": "hannad rehman",
  "license": "MIT",
  "scripts": {
    "start": "babel src --watch --out-dir dist --source-maps inline --copy-files --ignore spec.js,spec.jsx"
  },
  "dependencies": {
    "@pkg/constants": "^1.0.1",
    "@pkg/elements": "^1.0.1"
  },
  "peerDependencies": {
    "prop-types": "^15.6.2",
    "react": "^16.4.2",
    "react-router-dom": "^4.3.1"
  }
}

用这种方法。在任何应用程序可以导入它们之前,我所有的常用包都将进行单元测试、检查和构建。babel具有监视模式,可确保在发生更改时始终进行转译。

最后也是最重要的反应HMR按预期工作。

更新

上述解决方案确实有效,但几个月后我通过在 babel 加载器中使用 include 属性对其进行了更改

{
      test: /\.js(x?)$/,
      include: [/node_modules\/@pkg/],
      use: [
        'thread-loader',
        {
          loader: 'babel-loader',
          options: {
            cacheDirectory: true,
            configFile: path.resolve(
              __dirname,
              '../../../../',
              `${env.appConfig.folderSrc}/babel.config.js`,
            ),
          },
        },
      ],
    }
于 2018-09-12T10:09:18.477 回答