如何从其他(非项目)目录将 React 组件作为包/模块导入?

Posted

技术标签:

【中文标题】如何从其他(非项目)目录将 React 组件作为包/模块导入?【英文标题】:How can I import React Components as a package/module from some other(non-project) directory? 【发布时间】:2018-02-24 06:46:08 【问题描述】:

我在一个文件夹中有几个 React 组件,这不是一个反应项目。我为组件遵循的目录结构是:

~/components/Component1/index.jsx

~/components/Component2/index.jsx

现在我有一个名为 "myapp" 的 React 项目(使用 create-react-app 构建)我想将这些 React 组件作为包或模块导入我的项目中。

我尝试在 package.json 中提及依赖项,但出现错误,因为我无法在 package.json 中提及绝对路径。

我不想将这些组件作为 npm 包发布。

请帮我解决这个问题

【问题讨论】:

您是否尝试过在项目中复制组件并使用它们?在package.json 文件中不使用 as 模块 这样我就没有需要的包了,发生这种情况的主要目的是,我想在任何项目之外制作一个包,我可以在任何项目中使用它从它所在的地方导入它 【参考方案1】:

我知道答案可能听起来很基础,但你有什么理由不直接将组件复制粘贴到新应用中,然后将它们用作任何其他组件?

【讨论】:

这样我就没有需要的包了,发生这种情况的主要目的是,我想在任何项目之外制作一个包,我可以在任何项目中使用它从它所在的地方导入它。 我看到在这种情况下,您可以将包上传到 git 中的私有仓库,然后使用其 URL 安装包。是否有意义?那么你可以 对不起,我无意中发布了。我是说:那么你可以在几个项目中安装包 但是从具有几个文件夹(非项目)的 git 存储库到 PACKAGE 的转换仍然不清楚。而且我不能使用 package.json 中的 URL 作为依赖项。 您可以使用 git repo 的 URL 来安装包。您可以在此处找到示例:***.com/a/28729646/1644478。要将您的文件夹转换为一个包,您需要按照以下链接中描述的步骤操作:docs.npmjs.com/getting-started/creating-node-modules。让我知道它是否有帮助,否则我会尝试为您找到更好的链接【参考方案2】:

问题是:

我试图包装 material-ui 组件,如 iconButton、iconMenu 等,以使组件易于以编程方式使用。要将它们放入 git 存储库,我需要一个示例目录,其中包含使用我开发的组件的单独反应项目。所以,我需要开发一个包来保存组件的定义并将它们导出以用于其他项目。我想保持我的实现私有,所以我什至不能将它发布到 npm.js。

[你可以看问题陈述来彻底理解thr ptblem。]

解决方案帮助我完成所需的工作,我创建了一个新项目,其中添加了最少的依赖项。即

巴别塔 babel-cli 巴别塔核心 babel-loader babel-preset-es2015 babel-preset-react babel-preset-stage-2 html-webpack-plugin 原始加载器 网页包 webpack-dev-server

然后是 devDependencies

反应 反应域 material-ui [偶尔]

安装后,[这里是部分]我用以下脚本创建了一个 webpack.config.js:

const path = require('path')
const webpack = require('webpack')

module.exports = 
  devtool: 'cheap-eval-source-map',
  entry: './docs/entry.js',
  output: 
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js'
  ,
  resolve: 
    alias: 
      genericcomponents: path.join(__dirname, 'src')
    
  ,
  module: 
    loaders: [
      
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      
    ]
  ,
  devServer: 
    contentBase: 'docs/'
  

在上面的代码中,提到了转译过程entrydevtooloutput的输出后.我其实还有一个东西要定义,就是alias,我用存放组件的目录定义了别名。

现在这个包将包含我在别名参数中提供的名称的所有组件。

之后我提到了 transpilation 的加载器和 jsx 的文件格式,因此它将接受具有 JSX 语法的源。

最后我提到了我放置 index.htmlentry.js 文件的目录。

以下是我项目的目录结构:

我的 App.jsx 组件在 docs 文件夹 中。现在可以通过提供包名称导入components文件夹中的任何组件。

欢迎您讨论上述解决方案中出现的任何问题。

【讨论】:

以上是关于如何从其他(非项目)目录将 React 组件作为包/模块导入?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 GitHub 中的 react 应用程序作为组件导入到新的 react 应用程序中?

如何配置 webpack 以从其他 lerna 包中转译文件(从 create-react-app 中弹出)

在 React.js 中,我如何从组件的字符串表示中呈现组件?

如何在其他网站上嵌入 React 组件?

如何将 React 组件导出为 NPM 包以在单独的项目中使用?

Storybook - 如何使用样式组件(React + TS)从外部项目导入组件?