1. Предпосылки
В настоящее время бизнес-группа, в которой я состою, отвечает за систему управления фоном, но сторонней библиотеки для используемых компонентов нет, и все разработчики пишут их сами. А вот для Common Project пока в режиме копирования. Потом пришла идея управления общей библиотекой компонентов. В чем преимущество такого подхода?
- Это может осадить компоненты в группе и избежать дефектов повторного изготовления колеса.
- Унифицированные компоненты обслуживания, чтобы разные разработчики следовали одному и тому же набору стандартов использования.
- Его собственная библиотека UI может обеспечить визуальную и интерактивную согласованность системы.
- Повысьте эффективность разработки продуктов, повторно используйте ресурсы и сократите повторяющиеся разработки.
- Унифицированный дизайн проекта, правила языка кодирования, более простое общение.
- Сосредоточьтесь на своем бизнесе, тратьте меньше времени на визуальные требования и больше времени уделяйте написанию своего бизнеса.
2. Выбор технологии (думи + отцовская сборка)
Конечно, поинтересовавшись в Интернете, мы обнаружили, что многие люди делали подобные вещи, и мы можем учиться на большом опыте. Кто-то написал свою конфигурацию. В блоге Юньюна я скринил технологии, отвечающие моим условиям (думи + отцовская сборка). Почему выбирают его?
- dumi — это подключаемый интерфейсный фреймворк корпоративного уровня для Ant Financial, инструмент документирования, специально разработанный для сценариев разработки компонентов. По сравнению с папиной упаковкой документации компиляция сборки выполняется быстрее и удобнее.
- отцовская сборка является частью отцовской (библиотеки, объединяющей документацию и упаковку компонентов). Сосредоточьтесь на упаковке компонентов.
Почему я не решил написать его сам? Не только стоимость времени строительства, но и последующая оптимизация и т. д. В настоящее время я не уверен, что у меня получится лучше, чем у тех, кто занимается этим делом. В дальнейшем буду изучать как реализованы великие боги, но на ближайшее время хочу закончить построение своей библиотеки компонентов, поэтому сначала поленюсь ^^.
3. Создание библиотеки документов
@umijs/create-dumi-lib
Готовый инструмент документирования на основе Umi, ориентированный на разработку и документирование. Выполнение следующей команды инициализирует структуру проекта.
$ npm init
$ npx @umijs/create-dumi-lib
Структура каталогов документов
.umirc.ts
Это конфигурационный файл проекта umi, и думи является передовой практикой umi в разработке библиотек компонентов, но по сути это все еще подключаемый модуль umi, поэтому, пока umi настроен, его можно нормально использовать в думи. .
.fatherrc.ts
Это файл конфигурации отцовской сборки, здесь нужно использовать то, как компилируется библиотека компонентов, и типы, сгенерированные после компиляции.
запускать
бегатьnpm start
начать.
4. Пишите компоненты и справочную документацию
Напишите простой пример и документы.
4.1 Настройка логотипа официального сайта (.umirc.ts)
советы: ресурсы нужно размещать вpublic
ниже каталога. Напримерpublic/image/xxx.png
. В противном случае вы не сможете получить доступ.
// .umirc.ts
import { defineConfig } from 'dumi';
let BaseUrl = ''
export default defineConfig({
mode: 'site', // site: 站点模式(导航头 + 左侧菜单 + 右侧内容)。 doc:文档
title: 'Biz Library', // 组件库名称
favicon: BaseUrl + '/images/favicon.ico',
logo: BaseUrl + '/images/photos.svg',
description: '用于Biz Web Dev 前端组件开发。',
});
4.2 Написание компонентов и документации по компонентам
компонент: /src/Dialog/index.tsx
import React, { FC } from 'react';
import './index.less';
interface DialogProps {
onClick?: React.MouseEventHandler<HTMLElement>;
type?: 'default' | 'primary' | 'secondary';
disabled?: boolean;
}
const Dialog: FC<DialogProps> = ({ children, onClick, type = 'dialog' }) => {
return (
<div className={'biz_dev_dialog'} onClick={onClick}>
{children}
</div>
);
};
export default Dialog;
css: /src/Dialog/index.less
@btn-prefix-cls: ~'biz_dev';
.@{btn-prefix-cls} {
&_dialog {
padding: 6px 16px;
font-size: 12px;
min-width: 64px;
color: red;
}
}
Документация
- Документация компонента en: docs/component/dialog.md
- Документация компонента на китайском языке: docs/component/dialog.zh-CN.md
- Название пакета Biz-Web-library: это имя в Package.json
import React from 'react';
import { Dialog } from 'biz-web-library'; // 可通过包名引入,而不是相对路径
export default () => <Dialog>dialog example</Dialog>;
запускать
бегатьnpm run start
, На данный момент локальная среда разработки завершена, вы можете выполнять отладку во время разработки.
5. Тестирование КИ
Тестирование необходимо для библиотек компонентов. В сборке отца шутка интегрирована для модульного тестирования. Но тестирование компонентов React требует дополнительной настройки.
jest.config.js
module.exports = {
setupFiles: ['<rootDir>/testSetUp.js'],
testEnvironment: 'jsdom', // default: jsdom, 可配置: node
};
testSetUp.js
не забудьте установитьenzyme-adapter-react-16
а такжеenzyme
.
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({ adapter: new Adapter() });
Пишите тестовые случаи
import React from 'react';
import { render } from 'enzyme';
import Button from '../../src/Button';
describe('test', () => {
it('test render', () => {
let Wrapper = render(<Button>case one</Button>);
expect(true).toBeTruthy();
})
})
бегатьnpm run test
, выполнить через.
6. Полная загрузка и загрузка по требованию
Мы знаем, что многие библиотеки компонентов упаковывают компоненты единообразно и представляют их следующими способами. по умолчаниюfather-build
То же самое справедливо.
import { componentName } from 'biz-library';
Общие библиотеки (например, antd) импортируются по запросу путем настройки подключаемого модуля babel. И я надеюсь, что мою библиотеку компонентов можно будет импортировать по запросу без настройки плагинов.
import componentName from 'biz-library/componentName';
6.1 Реализовать загрузку по требованию
.fatherrc.ts
так какfather-build
Файл конфигурации, используемый для настройки компиляции библиотеки компонентов и типа компилируемого продукта. Общие настройкиesm: 'rollup'
достаточно. Но его недостаток в том, что он будет упакован вместе и не может быть введен по требованию. Поэтому я используюesm: 'babel'
.
export default {
target: 'browser',
esm: 'babel',
lessInBabelMode: true, // babel 模式下做 less 编译
entry: ['src/Button/index.tsx', 'src/Dialog/index.tsx'],
autoprefixer: {
browsers: ['ie>9', 'Safari >= 6'],
},
pkgs: [
// 组件依赖构建顺序, 例如 a组件依赖于b组件,那么需要先编译 b,在编译a,则 这里可以控制组件编译顺序
],
};
tsconfig.json
О других атрибутах и говорить нечего. "declaration": true
необходимо настроить для генерацииtypescript
проект.d.ts
файлы с суффиксами.
{
"compileOnSave": true,
"compilerOptions": {
"target": "es6",
"module": "esnext",
"lib": ["es2018", "dom"],
"rootDir": "./",
"outDir": "es",
"moduleResolution": "node",
"importHelpers": true,
"jsx": "react",
"esModuleInterop": true,
"sourceMap": true,
"baseUrl": "./",
"strict": true,
"declaration": true, // 只有declaration设置为true才能生成.d.ts后缀的文件
"allowJs": true,
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"strictNullChecks": false,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true,
"experimentalDecorators": true,
"skipLibCheck": true,
"paths": {
"@/*": ["src/*"],
"@@/*": ["src/.umi/*"],
"@@@/*": ["docs/*"]
},
"allowSyntheticDefaultImports": true,
"typeRoots": ["typings", "node_modules/@types"]
},
"include": ["src/**/*", "dosc/**/*"],
"exclude": [
"node_modules",
"lib",
"es",
"dist",
"typings",
"**/__test__",
"test"
]
}
Упаковать и опубликовать в npm
бегатьnpm run build
После того, как команда упакована локально, компоненты разделяются один за другим, что открывает нам путь для внедрения по требованию.
бегатьnpm run release
, выложите на npm, их можно установить через npm, он использовался в проекте. Npm следует обратить внимание на релизversion: 1.0.0
Не будь то же каждый раз.
import React from 'react';
import Button from 'biz-web-library/es/Button';
function App() {
return (<Button>click me</Button>);
}
export default App;
изменение пути к пакету
Как видно из приведенного выше использования,Button
не вbiz-web-library
Ниже я на самом деле хочу импортировать по запросу, используя следующее:
import Button from 'biz-web-library/Button';
После запросов я наконец нашел более элегантный способ его использования.Click Me
существуетpackage.json
Настройте следующую инструкцию в , а затем запустите ее напрямую.npm publish
Вот и все.
"prepublishOnly": "npm run build && cp -r ./es/* . && rm -rf ./es",
"postpublish": "git clean -fd",
"release": "npm publish",
7. Опубликуйте официальный сайт компонента на GitHub Pages.
На данный момент библиотека компонентов, которую я хочу, написана, и ее можно импортировать полностью или по запросу. Так как же позволить другим видеть нашу библиотеку компонентов. Здесь я используюgithub pages
.
конфигурация гитхаба
бегатьnpm run deploy
Документы можно развернуть на githubgithub pages
начальство. Это эквивалентно официальному сайту вашего компонента. пожалуйста убедитесьgithub
Настройки репозитория компонентов следующие: (Путь: Настройки => Параметры => Страницы GitHub:)
Мы видим сгенерированный адресhttps://yezizhao.github.io/biz-web-library/
, оно содержит название заводской библиотеки, поэтому при посещении адреса вы найдетеjs
а такжеcss
появляться404
不能访问了。此时不要慌,说明打包产生的路径不正确。 существует.umirc.ts
Файл,let BaseUrl = '/biz-web-library';
Вы можете изменить его. затем повторитеnpm run deploy
Просто опубликуйте это.
import { defineConfig } from 'dumi';
let BaseUrl = '/biz-web-library'; // 仓库的路径
export default defineConfig({
// 网站描述配置
mode: 'site',
title: 'Biz Library',
favicon: BaseUrl + '/images/favicon.ico',
logo: BaseUrl + '/images/photos.svg',
description: '用于Biz Web Dev 前端组件开发。',
// 打包路径配置
base: BaseUrl,
publicPath: BaseUrl + '/', // 打包文件时,引入地址生成 publicPath/xxx.js
outputPath: 'docs-dist',
exportStatic: {}, // 对每隔路由输出html
dynamicImport: {}, // 动态导入
hash: true, //加hash配置,清除缓存
manifest: {
// 内部发布系统规定必须配置
fileName: 'manifest.json',
},
// 多国语顺序
locales: [
['en-US', 'English'],
['zh-CN', '中文'],
],
// 主题
theme: {
'@c-primary': '#16c35f',
},
});
думи css отсутствует
Теперь ваша веб-страница доступна, но css пропал. На самом деле потому чтоmd
Представленный в нем css указывает на каталог после сборки и не может напрямую указывать на исходный каталог. яpackage.json
Средняя конфигурацияsideEffects
решил проблему.
"sideEffects": ["./src/**/*.less"],
78. Заключение
До сих пор была создана простая среда разработки библиотеки компонентов и среда публикации, но в приведенном выше примере фактически используется общедоступная сеть github. Внутренние компоненты компании не должны публиковаться в общедоступной сети, поэтому вам также необходимо создать внутренний частный npm. Описание не будет.
экземпляр примера github:GitHub.com/YMoth Zhao/Be…