Привет всем вам!

Сегодня я познакомлю вас с тем, как создать децентрализованный модуль внедрения реактивных зависимостей с использованием межпланетной файловой системы.

Прежде всего, прежде чем мы продолжим, нам понадобятся приложения IPFS Desktop или CLI.

IPFS Desktophttps://github.com/ipfs-shipyard/ipfs-desktop/releases

Интерфейс командной строки IPFS — https://github.com/ipfs/js-ipfs

Если у вас уже есть jsipfs, введите следующую команду, чтобы запустить Daemon

jsipfs daemon

Если вы устанавливаете его в первый раз:

npm i -g ipfs
jsipfs init
jsipfs daemon

Теперь у вас есть запущенный демон, мы пока оставим его открытым.

Давайте начнем с клонирования примера репозитория для децентрализованного модуля.

git clone https://github.com/rxdi/ipfs-package-example

1.Установка зависимостей

npm install

2. Модуль сборки:

npm run build

Команда сборки будет использовать внутри parcel-bundler .

С этого шага у нас есть файлы index.js и index.map, представляющие наш новый собранный модуль.

3.Развертывание модуля:

npm run deploy

Вы должны увидеть что-то вроде этого, это наши types и module:

added QmW1vAT4oy8w1iB8YoZMvmHoVF4GUHT1eE7h49UqViWawW index.d.ts
added QmfCbYHggmJ5ZdnTRZ9X56iV6KR1REqxKmbX6GjspamH5w index.js

Добавьте конфигурацию в index.json со следующей конфигурацией:

{
    "name":"@test",
    "typings": "QmW1vAT4oy8w1iB8YoZMvmHoVF4GUHT1eE7h49UqViWawW",
    "module": "QmfCbYHggmJ5ZdnTRZ9X56iV6KR1REqxKmbX6GjspamH5w"
}

4. Развертывание конфигурации для модуля

npm run deploy-config

После последнего шага мы развертываем нашу конфигурацию модуля как index.json

added QmWtJLqyokMZE37DgncpY5HhFvtFQieBzMPDQ318aJeTw6 index.json

Позволяет тормозить команду сборки:

4.1

Целью этого является размещение документации для текущего модуля, и тот же хэш можно использовать для загрузки модуля.

Вместо создания файла `index.json` создайте `index.html`

При запросе этой страницы rxdi будет анализировать содержимое между:

<! — meta-rxdi-ipfs-module--> метатеги

<div style="visibility:hidden;z-index:-10000;position:absolute;">
<!--meta-rxdi-ipfs-module-->
{
    "name":"@test",
    "typings": "QmW1vAT4oy8w1iB8YoZMvmHoVF4GUHT1eE7h49UqViWawW",
    "module": "QmfCbYHggmJ5ZdnTRZ9X56iV6KR1REqxKmbX6GjspamH5w",
    "dependencies": [""]
}
<!--meta-rxdi-ipfs-module-->
</div>

Пример модуля `index.html`: http://ipfs.io/ipfs/QmeFUenbAy4kxKj6hA4kP662nwm11dGUTG8HZowBuapbFv

Подробные инструкции можно найти ниже.

Внутри `gapi-cli.conf.yml` есть команда `gapi module build` или `npm run build`

```
commands:
  testing:
    browser: jest --env jsdom --testPathPattern="/src/.*\\.browser.spec.(ts|tsx|js)$"
    node: jest --env node --testPathPattern="/src/.*\\.spec.(ts|tsx|js)$"
  module:
    build:
      - ./node_modules/.bin/parcel build --target node development/index.ts
      - ./node_modules/.bin/rxdi-merge --name @test --project . --out dist/index.d.ts
      - find . -not -path "./node_modules/*" -type f -iname \*.map -delete
      - cp -r dist/* .
      - ./node_modules/.bin/gapi module clean
    clean:
      - rm -rf dist
      - rm -rf .cache
    deploy:
      - jsipfs add index.js
      - jsipfs add index.d.ts
    deploy-config:
      - jsipfs add index.json
```

Давайте подробнее рассмотрим команду за командой

Здание

Это займет index.ts внутри папки разработки и свяжет его с одним файлом js внутри dist/index.js` с сопоставлением `dist/index.map`

Вы должны экспортировать все, например `export * from ‘’`, внутри этого `index.ts`, потому что посылка должна знать, что включает в себя этот модуль.

В противном случае вы получите не все файлы в комплекте.

parcel build — target node development/index.ts

Объединение

Эта команда будет искать *.ts файлов, из них будет сгенерировано index.d.ts файлов, представляющих все ваши Typescript Module Definitions

Вы можете установить это глобально, набрав: npm i @rxdi/dts-merge -g

В этот репозиторий включен devDependencies [@rxdi/dts-merge](https://github.com/rxdi/dts-merge).

rxdi-merge — name @test — project . — out dist/index.d.ts

Если вы хотите изменить экспортированное пространство имен, также известное как @test, просто укажите другое имя в параметре — name @yourName.

Не забудьте изменить файл index.json и повторно развернуть свой модуль.

{
“name”:”@yourName”,
“typings”: “hash”,
“module”: “hash”,
“dependencies”: [“”]
}

Затем используйте новый сгенерированный хэш для установки вашего модуля rxdi i hash

Удалить неиспользуемые файлы .map

Эта команда будет искать все файлы *.map внутри вашего проекта, сгенерированного из пакета, и удалит их, поскольку они нам не нужны, когда модуль собирается для развертывания.

find . -not -path “./node_modules/*” -type f -iname \*.map -delete

Копировать сгенерированный пакет

Скопируйте все сгенерированные файлы в корень `index.js`, `index.d.ts` эти два файла представляют наш модуль

cp -r dist/* .

Чистая сборка

gapi module clean

Развертывание в сети ipfs

Теперь нам нужно развернуть наш модуль в сети ipfs.

1.Создайте файл с именем index.json

2.Добавьте этот контент

{
“name”:”@test”,
“typings”: “QmW1vAT4oy8w1iB8YoZMvmHoVF4GUHT1eE7h49UqViWawW”,
“module”: “QmfCbYHggmJ5ZdnTRZ9X56iV6KR1REqxKmbX6GjspamH5w”,
“dependencies”: [“”],
}

Где:

name — Пространство имен модулей важно и в конце концов будет использоваться следующим образом: `import { TestModule } from ‘@test’` в этом случае

`typings` — Хэш из сети ipfs, ведущий к нашим сгенерированным типам `index.d.ts`

Папка для скачивания: ‘node_modules/@types/@test

`module` — Хэш из сети ipfs, ведущий к нашему сгенерированному модулю через ParcelJS `index.js`

Папка для скачивания: ‘node_modules/@test

`dependencies` — Каждый модуль может иметь множество зависимостей от одного и того же типа pass `hash` [‘QmeFUenbAy4kxKj6hA4kP662nwm11dGUTG8HZowBuapbFv’]

Чтобы использовать типизацию, вам нужно установить `typeRoots` на node_modules/@types внутри `tsconfig.json`

Система автоматически загрузит наборы в папку @types

“typeRoots”: [
   “node_modules/@types”
]

Пример модуля @test: https://ipfs.io/ipfs/QmWtJLqyokMZE37DgncpY5HhFvtFQieBzMPDQ318aJeTw6

Теперь вы должны знать, что делать! Нам нужно развернуть файлы index.js и index.d.ts, откуда мы будем получать ключ Hash.

Нам нужен модуль ipfs для развертывания наших модулей, или вы можете развернуть их вручную с помощью настольного приложения, предоставленного из

Рабочий стол Ipfs Shipyard https://github.com/ipfs-shipyard/ipfs-desktop

Документацию по ipfs CLI можно найти здесь: https://github.com/ipfs/js-ipfs

npm install ipfs -g

Чтобы добавить наши модули в ipfs:

jsipfs add index.js && jsipfs add index.d.ts

Это напечатает что-то вроде этого

added QmW1vAT4oy8w1iB8YoZMvmHoVF4GUHT1eE7h49UqViWawW index.d.ts
added QmfCbYHggmJ5ZdnTRZ9X56iV6KR1REqxKmbX6GjspamH5w index.js

Давайте подготовим нашу конфигурацию внутри `index.json`

{
“name”:”@test”,
“typings”: “QmW1vAT4oy8w1iB8YoZMvmHoVF4GUHT1eE7h49UqViWawW”,
“module”: “QmfCbYHggmJ5ZdnTRZ9X56iV6KR1REqxKmbX6GjspamH5w”
}

Разверните `index.json` в сети ipfs

jsipfs add index.json

Это напечатает что-то вроде этого

added QmWtJLqyokMZE37DgncpY5HhFvtFQieBzMPDQ318aJeTw6 index.json

Вуаля!!!! Ты готов!!! Теперь давайте установим этот модуль внутри инфраструктуры `rxdi`

Возьмем [простой пример на стороне сервера] (https://github.com/rxdi/starter-server-side)

Внутри `package.json` добавьте следующую конфигурацию

“ipfs”: [
{
“provider”: “https://ipfs.io/ipfs/",
“dependencies”: [
“QmWtJLqyokMZE37DgncpY5HhFvtFQieBzMPDQ318aJeTw6”
]
}
],

где:

`provider` — это общедоступный шлюз, откуда мы будем загружать наши модули, которые вы можете попробовать также с вашим приватным шлюзом http://127.0.0.1:8080/ipfs/

`dependencies` — этот массив из хэшей представляет наши модули с хешем, также известным как index.json, которые мы развертываем в сети ipfs.

{
“name”:”@test”,
“typings”: “QmW1vAT4oy8w1iB8YoZMvmHoVF4GUHT1eE7h49UqViWawW”,
“module”: “QmfCbYHggmJ5ZdnTRZ9X56iV6KR1REqxKmbX6GjspamH5w”
}

Теперь нам нужно запустить нашу команду установки rxdi:

Это возьмет конфигурацию из package.json › ipfs и загрузит все модули, представляющие хэши внутри «зависимостей».

Смотрите реальный пример: https://ipfs.io/ipfs/QmWtJLqyokMZE37DgncpY5HhFvtFQieBzMPDQ318aJeTw6

Запуск из локальной установки node_modules

node ./node_modules/@rxdi/core/bin/root.js install

or

./node_modules/.bin/rxdi install

или глобальный

npm i -g @rxdi/core

Теперь у вас должна быть глобальная команда `rxdi install` для всех проектов `rxdi`, которая будет читать `package.json` › объект «ipfs».

Команда будет искать `package.json` внутри текущего рабочего каталога, где она выполняется.

Теперь, когда мы выполняем:

rxdi install``

Вы должны увидеть что-то вроде этого:

[
{
“hash”: “QmWtJLqyokMZE37DgncpY5HhFvtFQieBzMPDQ318aJeTw6”,
“provider”: “https://ipfs.io/ipfs/"
}
]
Modules installed!

Если вы хотите установить один тип зависимости:

В короткой версии по умолчанию используется провайдер https://ipfs.io/ipfs/.

rxdi install QmWtJLqyokMZE37DgncpY5HhFvtFQieBzMPDQ318aJeTw6

Длинная версия

rxdi install — hash=QmWtJLqyokMZE37DgncpY5HhFvtFQieBzMPDQ318aJeTw6 — provider=https://ipfs.io/ipfs/

##### В действии

import { Module, Bootstrap } from ‘@gapi/core’;
import { TestModule, TestService } from ‘@test’;
@Module({
imports: [
TestModule
]
})
export class AppModule { }
Bootstrap(AppModule)
.subscribe(
() => console.log(‘Started!’),
(e) => console.error(e)
);

Это оно !

Вы можете наслаждаться децентрализованной модульной системой rxdi!

Будет создана платформа, представляющая все ваши приватные и общедоступные модули.

Цель состоит в том, чтобы когда вы копируете `QmWtJLqyokMZE37DgncpY5HhFvtFQieBzMPDQ318aJeTw6` и вставляете его в поиск, он должен показать вам пакет с README.md и всем остальным, как в обычном репозитории.

Нджой! :)