SDK (Software Development Kit) — это набор инструментов разработки программного обеспечения в одном устанавливаемом пакете. SDK может включать библиотеки, API и образцы кода для конкретной платформы или языка программирования. SDK помогают разработчикам создавать приложения для конкретной платформы. В этой статье мы рассмотрим этапы создания SDK с использованием TypeScript.
Начало работы с TypeScript и Node.js
TypeScript — это надмножество JavaScript, которое добавляет в язык необязательные аннотации типов и объектно-ориентированное программирование на основе классов. TypeScript легко освоить тем, кто знаком с JavaScript.
Node.js — популярная платформа для создания серверных приложений. Это быстро и эффективно, что делает его идеальным для создания SDK.
Вы можете установить TypeScript в вашей локальной среде разработки, выполнив следующую команду:
npm install -g typescript
Настройка репозитория и конфигурации
Итак, начнем с реализации.
Давайте инициализируем наш проект node js, используя npm init -y
Установите необходимые зависимости:
npm install — save-dev microbundle npm install isomorphic-unfetch
microbundle
— это сборщик с нулевой конфигурацией для небольших библиотек и веб-компонентов. Он используется для упаковки и распространения вашего кода в формате, который можно использовать в различных средах.
isomorphic-unfetch
— это библиотека, реализующая Fetch API браузера для использования как на клиенте, так и на сервере. Эта библиотека позволяет вам делать HTTP-запросы таким образом, чтобы они были совместимы как с клиентским, так и с серверным JavaScript.
Далее вам необходимо инициализировать TypeScript с помощью следующей команды:
tsc --init
Это создаст в вашем проекте файл tsconfig.json
, который является файлом конфигурации для TypeScript. Этот файл можно использовать для указания параметров вашего компилятора TypeScript.
Убедитесь, что вы изменили tsconfig.json
, чтобы иметь следующие значения
{ "compilerOptions": { "module": "commonjs", "declaration": true, "removeComments": true, "allowSyntheticDefaultImports": true, "target": "es2017", "sourceMap": false, "outDir": "./dist", "baseUrl": "./", "incremental": true }, "include": ["src/**/*"], "exclude": ["node_modules", "test", "lib", "**/*spec.ts"] }
Реализация кода
Создайте папки и файлы в соответствии со структурой ниже.
. └── sdk/ ├── src/ │ ├── resources/ │ │ ├── base.ts │ │ ├── posts/ │ │ │ ├── index.ts │ │ │ └── types.ts │ │ └── users/ │ │ ├── index.ts │ │ └── types.ts │ └── index.ts ├── tsconfig.json └── package.json
Base.ts
// src/resources/base.ts import fetch from 'isomorphic-unfetch'; type Config = { apiKey: string; baseUrl?: string; }; export abstract class Base { private apiKey: string; private baseUrl: string; constructor(config: Config) { this.apiKey = config.apiKey; this.baseUrl = config.baseUrl || 'https://jsonplaceholder.typicode.com'; } protected request<T>(endpoint: string, options?: RequestInit): Promise<T> { const url = `${this.baseUrl}${endpoint}`; const headers = { 'Content-Type': 'application/json', 'api-key': this.apiKey, }; const config = { ...options, headers, }; return fetch(url, config).then((response) => { if (response.ok) { return response.json(); } throw new Error(response.statusText); }); } }
Класс Base
— это абстрактный класс, обеспечивающий общую функциональность для всех ресурсов в нашем SDK. Он принимает объект Config
со свойствами apiKey
и baseUrl
в своем конструкторе, который является общим и необходим для вызова API. Метод request
используется для выполнения HTTP-запросов к API. Этот метод принимает конечную точку и необязательный RequestInit
объект для дополнительной настройки. Метод возвращает обещание с данными ответа типа T
.
Типы ресурсов и реализация
Затем давайте создадим соответствующие ресурсы, такие как posts
, users
вместе с их типами в папке resources/{resource}. Ниже приведен пример posts
.
При необходимости выполните аналогичную реализацию для других ресурсов.
// src/resources/posts/types.ts export declare type Post = { id: number; title: string; body: string; userId: number; }; export declare type NewPost = { title: string; body: string; userId: number; }; // src/resources/posts/index.ts import { Base } from '../base'; import { NewPost, Post } from './types'; const resourceName = 'posts'; export class Posts extends Base { getPostById(id: number): Promise<Post> { return this.request(`/${resourceName}/${id}`); } getPosts(): Promise<Post[]> { return this.request(`/${resourceName}`); } createPost(newPost: NewPost): Promise<Post> { return this.request(`/${resourceName}`, { method: 'POST', body: JSON.stringify(newPost), }); } }
Файл types.ts
содержит интерфейсы TypeScript для таких ресурсов, как Post
, NewPost
. Эти объекты будут использоваться во всем пакете SDK. Эти интерфейсы предоставляют план того, какие данные должен содержать каждый объект.
Точка входа: index.ts
// src/index.ts import { Posts } from './resources/posts'; import { Users } from './resources/users'; export class Library { posts: Posts; users: Users; constructor(config: { apiKey: string; baseUrl?: string }) { this.posts = new Posts(config); this.users = new Users(config); } }
Этот файл является точкой входа в SDK. Он экспортирует класс Library
, который действует как центральная точка доступа ко всем ресурсам. Конструктор этого класса принимает объект config
, содержащий apiKey
и baseUrl
. apiKey
используется для аутентификации, а baseUrl
используется для указания базового URL-адреса для конечных точек API. Этот класс создает экземпляры классов Posts
и Users
и делает их доступными в качестве свойств.
Пакет JSON
В package.json
добавьте main
, module
, unpkg
и types
, как показано ниже. Кроме того, добавьте сборку в объект сценариев, чтобы удалить предыдущую папку dist и сгенерировать результирующие файлы с помощью библиотеки microbundle
.
{ "name": "sdk", "version": "1.0.0", "description": "", "main": "dist/index.js", "module": "dist/index.m.js", "unpkg": "dist/index.umd.js", "types": "dist/index.d.ts", "scripts": { "build": "rm -rf dist && microbundle --tsconfig tsconfig.json --no-sourcemap" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "microbundle": "^0.15.1" }, "dependencies": { "isomorphic-unfetch": "^4.0.2" } }
Сборка и генерация окончательных файлов
npm run build
Это будет использовать библиотеку microbundle
для создания различных форматов кода в папке dist
.
Опубликовать в реестре NPM
- Создайте учетную запись в Реестре NPM.
- Войдите в свою учетную запись npm, используя следующую команду:
npm login
- В package.json добавьте следующие поля
{ ... "exports": { "require": "./dist/index.js", "default": "./dist/index.modern.js" }, "files": [ "dist" ] }
- Чтобы опубликовать в реестр, запустите
npm publish
Тестовый SDK
Установите пакет из реестра. Если он не опубликован, вы также можете использовать `ссылку npm ‹path_to_sdk› в своем тестовом репозитории на основе узла.
Вы можете потреблять, используя следующее:
import { Library } from '<npm_repo>'; const client = new Library({ apiKey: 'your-api-key', baseUrl: 'https://jsonplaceholder.typicode.com', }); client.posts .createPost({ body: 'Lorem Epsum', title: 'How to ?', userId: 1, }) .then((p) => { console.log(`Created new post with id ${p.id}`); }); client.users.getUserById(1).then((a) => console.log(a));
Заключение
Создание SDK с использованием TypeScript — отличный способ упаковки и повторного использования функциональности. Создав набор сущностей, которые можно использовать вместе, вы можете предоставить пользователям удобный и простой в использовании интерфейс. С помощью TypeScript вы можете предоставлять определения типов и обеспечивать удобство сопровождения и отладку кода.
В заключение мы рассмотрели шаги по созданию SDK с помощью TypeScript и его публикации в реестре npm. Мы надеемся, что вы нашли эту статью полезной.
Если вам понравилось, подпишитесь, поставьте отметку «Нравится» и поделитесь ею с друзьями и коллегами. Ваша поддержка помогает нам создавать для вас более ценный контент.
Дополнительные материалы на PlainEnglish.io.
Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .