从 Create React App 创建 NPM 包并在 Gitlab 上发布

Flo*_*nig 4 npm gitlab npm-publish create-react-app npm-package

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

我创建了一个 React 应用程序,并将crate react app其作为私有存储库上传到我的GitLab帐户。(默认)React 应用程序在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>"
Run Code Online (Sandbox Code Playgroud)
  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/"
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 跑步npm publish

正如我所说,该包会在罚款范围内上传到我的 GitLab 帐户。我现在遇到的唯一问题是yarn start从本地存储库运行确实会导致空白屏幕。我还意识到,yarn 不再重定向到http://localhost:3000,而是重定向到http://localhost:3000/scope/repository-name.

我在这里缺少什么?

谢谢!

Flo*_*nig 8

经过大量的尝试和错误(甚至更多的研究),我终于找到了解决我的问题的方法。我想指出的是,我仍然不完全确定为什么会发生某些事情,但希望这个解决方案能够帮助某人避免浪费时间。

目标

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

每当我开始开发时,我都会从create react app和 开始,因为 React 应用程序通常是单页应用程序,所以打包它并没有真正的意义。尽管如此,如果我们想开发一些稍后将成为应用程序一部分的组件,但仍然想在本地测试行为,那么这样做是有意义的。

我将描述如何在 Gitlab 上创建包,但我想它与任何其他存储库托管服务的工作方式相同(除了身份验证和范围的详细信息)。

设置

我们从设置 React 应用程序开始

npx create-react-app react-package
Run Code Online (Sandbox Code Playgroud)

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

我们的组件将非常简单

npx create-react-app react-package
Run Code Online (Sandbox Code Playgroud)

遗嘱index.js作为起点

import React from 'react`;

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

接下来我们要做的是在 Gitlab 上创建一个存储库并将其链接到我们刚刚创建的项目。.npmrc然后我们在应用程序的根目录中创建一个文件。这是可选的,但我发现这非常简单,因为Gitlab 上有一个很好的文档。我的.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>"
Run Code Online (Sandbox Code Playgroud)

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

npm init
Run Code Online (Sandbox Code Playgroud)

暂时使用所有标准选项即可。

包装

现在是时候进行实际的构建和包装了。首先,我们必须安装更多的开发依赖项,这将为我们进行转译(我不会解释所有这些,但请在此处查看更多信息)

npm i --save-dev babel-cli babel-preset-env babel-preset-react babel-preset-stage-0
Run Code Online (Sandbox Code Playgroud)

现在我们必须修改package.json. 首先把线去掉

"private: true"
Run Code Online (Sandbox Code Playgroud)

然后替换构建命令

"scripts": {
  "build": "rm -rf dist && NODE_ENV=production npx babel src/PackagedComponent --out-dir dist --copy-files",
  ...
},
     
Run Code Online (Sandbox Code Playgroud)

然后添加行

"main": "dist/index.js",
"module": "dist/index.js",
"files": "/dist",
"babel": {
   "presets": [ "react", "env", "stage-0" ]
}
Run Code Online (Sandbox Code Playgroud)

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

"name": "@group-name/packaged-component-package",
Run Code Online (Sandbox Code Playgroud)

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

"publishConfig": {
  "@group-name:registry": "https://gitlab.com/api/v4/projects/<your_project_id>/packages/npm/"
}
Run Code Online (Sandbox Code Playgroud)

小心你得到了scope正确的project id

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

npm i
Run Code Online (Sandbox Code Playgroud)

运行构建命令

npm run build
Run Code Online (Sandbox Code Playgroud)

并发布到Gitlab

npm publish
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,您应该会在 Gitlab 上的Packages & Registries下看到您的软件包。

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

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

# 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>"
Run Code Online (Sandbox Code Playgroud)

完成后运行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;
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

希望这有帮助!