Привет всем вам!
Сегодня я познакомлю вас с тем, как создать децентрализованный модуль внедрения реактивных зависимостей с использованием межпланетной файловой системы.
Прежде всего, прежде чем мы продолжим, нам понадобятся приложения IPFS Desktop или CLI.
IPFS Desktop — https://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 и всем остальным, как в обычном репозитории.
Нджой! :)