通过Create React App创建NPM软件包并发布在Gitlab上 目标设置包装将组件添加到另一个应用程序

如何解决通过Create React App创建NPM软件包并发布在Gitlab上 目标设置包装将组件添加到另一个应用程序

这可能是一个愚蠢的问题,但我真的不知道发生了什么。

我已经用crate react app创建了一个React App,并将其作为私有存储库上传到了我的 GitLab 帐户。 (默认)React App在yarn start本地运行localhost:3000后按预期启动。由于需要为正在进行的代码开发创建软件包,因此我开始在GitLab上使用 NPM注册表。这实际上很容易:

  1. 在应用目录中创建一个.npmrc
  2. 添加作用域存储库ID 身份验证令牌(我已选择使用个人令牌)
# Set URL for your scoped packages.
# This is my top-level group at GitLab

@scope:registry=https://gitlab.com/api/v4/packages/npm/


# Add the token for the scoped packages URL.
# I have chosen to use the personal key -> more infos: https://docs.gitlab.com/ee/user/packages/npm_registry/

//gitlab.com/api/v4/packages/npm/:_authToken="<auth-token>"


# Add token for uploading to the registry.

//gitlab.com/api/v4/projects/<project-ID>/packages/npm/:_authToken="<auth-token>"
  1. 运行npm init初始化程序包
  2. 像这样将作用域 publishConfig 添加到package.json
{
  "name": "@scope/package-name","version": "0.1.0","main": "index.js",<-- the entry point 
  ...
  "publishConfig": {
    "@scope:registry": "https://gitlab.com/api/v4/projects/<project-ID>/packages/npm/"
  }
}
  1. 运行npm publish

就像我说过的一样,该软件包会在 scope 罚款的情况下上传到我的GitLab帐户。我现在唯一的问题是从本地存储库运行yarn start会导致白屏。我还意识到,yarn不再重定向到http://localhost:3000,而是重定向到http://localhost:3000/scope/repository-name

我在这里想念什么?

谢谢!

解决方法

经过反复尝试(甚至更多研究),我终于找到了解决问题的方法。我想指出的是,我仍然不完全确定为什么会发生某些事情,但是希望这种解决方案可以帮助他们避免浪费时间。

目标

基本上,我想将某些反应组件作为 NPM包发布到Gitlab。我正在一个项目中工作,该项目包含许多不同的React组件-其中一些是独立的单页应用程序,而另一些则是“ App”的一部分。作为应用程序一部分的组件也可能在以后的另一个项目中重用。因此,这使它们有资格被包装。

每当我开始开发时,我就从create react app开始,由于React App通常是单页应用程序,因此打包它实际上没有任何意义。但是,如果我们要开发一些组件,这些组件以后将成为应用程序的一部分,但仍然想在本地测试行为,那么这样做是有意义的。

我将描述如何在Gitlab上创建软件包,但我想它与其他任何存储库托管服务都一样(除了带有身份验证和范围的详细信息)。

设置

我们首先设置我们的React App

npx create-react-app react-package

安装完所有组件后,导航至应用程序文件夹cd react-package,然后开始开发组件。对于我们的示例,我们在src文件夹内创建一个名为PackagedComponent的文件夹,其中将包含2个文件PackagedComponent.jsxindex.js

我们的组件将非常简单

import React from 'react`;

export const PackagedComponent = () => {
  return (
    <h1>This is my packaged component!</h1>
  );
}

index.js将作为起点

export { PackagedComponent } from './PackagedComponent';

接下来,我们要做的是在Gitlab上创建一个存储库,并将其链接到我们刚刚创建的项目。然后,我们在应用程序的根目录中创建一个.npmrc文件。这是可选的,但我发现这确实很容易,因为Gitlab上有一个不错的documentation。我的.npmrc文件看起来像这样

# Add token for uploading to the registry. Replace <your_project_id>
# with the project you want your package to be uploaded to.
# The auth toke is only necessary if you have a private package

//gitlab.com/api/v4/projects/< your_project_id>/packages/npm/:_authToken="< your_auth_token>"

接下来要做的是为项目创建package.json,因此我们要做

npm init

暂时使用所有标准选项。

包装

现在是时候进行实际的建筑和包装。首先,我们必须安装更多的dev依赖项,这些依赖项将为我们进行转译(我将不解释所有这些,而是​​查看here以获取更多信息)

npm i --save-dev babel-cli babel-preset-env babel-preset-react babel-preset-stage-0

现在我们必须修改package.json。首先删除该行

"private: true"

然后替换 build命令

"scripts": {
  "build": "rm -rf dist && NODE_ENV=production npx babel src/PackagedComponent --out-dir dist --copy-files",...
},

然后添加行

"main": "dist/index.js","module": "dist/index.js","files": "/dist","babel": {
   "presets": [ "react","env","stage-0" ]
}

更改name以适应范围。就我而言,我创建了一个包含我的packaged-component项目的组。在这种情况下,组名是范围@group-name/packaged-component-package

"name": "@group-name/packaged-component-package",

Gitlab需要一个publishConfig,所以我们必须添加

"publishConfig": {
  "@group-name:registry": "https://gitlab.com/api/v4/projects/<your_project_id>/packages/npm/"
}

请注意您正确使用了scopeproject id

现在我们只需要安装缺少的软件包

npm i

运行构建命令

npm run build

并发布到Gitlab

npm publish

如果一切顺利,您应该会在Gitlab上的软件包中找到您的软件包,该软件包位于 Packages&Registries

将组件添加到另一个应用程序

现在,我们要在另一个应用程序中使用打包的组件。我们可以再次运行npx create-react-app test-app。在应用目录中再次添加.npmrc

# Set URL for your scoped packages.
@group-name:registry=https://gitlab.com/api/v4/packages/npm/

# Add the token for the scoped packages URL. This will allow you to download
# `@foo/` packages from private projects.
# You only need this if the package is private
//gitlab.com/api/v4/packages/npm/:_authToken="<your_auth_token>"

完成此操作后,运行npm i,您的组件应出现在node_modules下的@group-name/packaged-component-package目录中。

然后打开App.js并添加行

import './App.css';

// import the packaged component
import { PackagedComponent } from '@group-name/packaged-component-package';

function App() {
  return (
    <div className="App">
      <PackagedComponent />
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

理想情况下,您应该看到以下屏幕

enter image description here

希望这对您有所帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-