经过大量的尝试和错误(甚至更多的研究),我终于找到了解决问题的方法。我想指出,我仍然不完全确定为什么会发生某些事情,但希望这个解决方案能帮助他们避免浪费时间。
目标
基本上,我想将某些React 组件作为NPM 包发布到Gitlab。我在一个项目中工作,其中包含许多不同的 React 组件——其中一些是独立的单页应用程序,而另一些是“应用程序”的一部分。作为应用程序一部分的组件也可能稍后在另一个项目中重用。因此,这使它们有资格被打包。
每当我开始开发时,我都会create react app
从一个 React App 开始,因为 React App 通常是一个单页应用程序,所以打包它并没有什么意义。尽管如此,如果我们想开发一些稍后将成为应用程序一部分的组件,但仍想在本地测试行为,那么这样做是有意义的。
我将描述如何在 Gitlab 上创建包,但我想它与任何其他存储库托管服务的工作方式相同(除了身份验证和范围的详细信息)。
设置
我们从设置我们的 React 应用程序开始
npx create-react-app react-package
安装完所有内容后,导航到应用程序文件夹cd react-package
并开始开发组件。对于我们的示例,我们在src
名为的文件夹内创建一个文件夹PackagedComponent
,其中包含 2 个文件PackagedComponent.jsx
和index.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 上有一个很好的文档。我的.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
暂时使用所有标准选项。
包装
现在是时候进行实际的构建和包装了。首先,我们必须安装更多的开发依赖项,这些依赖项将为我们进行转译(我不会解释所有这些,但请查看此处以获取更多信息)
npm i --save-dev babel-cli babel-preset-env babel-preset-react babel-preset-stage-0
现在我们必须修改package.json
. 首先删除线
"private: true"
然后替换构建命令
"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
项目的组。在这种情况下,组名是 scope @group-name/packaged-component-package
。
"name": "@group-name/packaged-component-package",
Gitlab 需要 apublishConfig
所以我们必须添加
"publishConfig": {
"@group-name:registry": "https://gitlab.com/api/v4/projects/<your_project_id>/packages/npm/"
}
小心你得到正确scope
的project id
!
现在我们只需要安装缺少的包
npm i
运行构建命令
npm run build
并发布到 Gitlab
npm publish
如果一切顺利,你应该会在 Gitlab 的Packages & Registries下看到你的包。
将组件添加到另一个应用程序
现在我们想在另一个应用程序中使用我们打包的组件。我们可以再跑npx create-react-app test-app
一次。在 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;
理想情况下,您应该看到以下屏幕
希望这有帮助!