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 .