React Native kütüphanenizi NPM’de yayınlama rehberi

Fatih Can
DIGIEGGS

--

Merhaba. Ben Fatih. DIGIEGGS’te front end geliştirici olarak çalışıyorum. Bu yazıda, geliştirdiğiniz bir React Native componentini, NPM’de nasıl yayınlayabileceğinizi, kendi deneyimimden yola çıkarak anlatacağım.

Geçen hafta, React Native ve Firebase ile OTP auth üzerinde çalışırken, kullanıcıdan telefon numarasıyla beraber, bir ülke alan kodu girişi almam gerekti. Önce, “Güzel bir picker kütüphanesi bulayım.” diye düşündüm fakat bulduğum kütüphaneler customizable olmadığı ve tasarımlarını beğenmediğim için kendi picker componentimi tasarlamaya karar verdim. Daha sonrasında ise şirket olarak açık kaynak dünyasına bir katkı yapmak niyetiyle yayınlamaya karar verdik.

Göz atmak veya denemek isterseniz: NPM |GitHub

Ülke alan kodu dropdown componenti

Sol tarafta görebileceğiniz gibi, filtrelenebilen, bayraklı ve FlatList ile yaptığım için lazy olarak yüklenen ve performans dostu bir component geliştirdim.

Öncelikle, kullandığım üçüncü parti uygulamaları belirtmek istiyorum.

Ülkeleri https://restcountries.eu/ adresinden çekip, bir JSON dosyasına koydum.

Bayrakları ise, uri olarak https://www.countryflags.io/ adresinden çektim.

Şimdi, bu componenti nasıl NPM’de yayınlanacak hale getireceğimize bakalım.

Bir React Native projesi initialize edelim

Bare workflow ile, TypeScript konfigürasyonuna sahip bir proje oluşturmak için aşağıdaki komutu çalıştıralım.

npx react-native init AwesomeTSProject — template react-native-template-typescript

TypeScript konfigürasyonu

{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"jsx": "react-native",
"lib": ["dom", "esnext"],
"moduleResolution": "node",
"skipLibCheck": true,
"resolveJsonModule": true,
"strict": true
},
"include": ["src/index.tsx"],
"exclude": ["node_modules", "babel.config.js", "metro.config.js", "jest.config.js"]
}

Package.json konfigürasyonu

Package.json dosyası, NPM ile kütüphanenizin arasında bir haberleşme aracı görevi görüyor. Aşağıdaki, yayınladığım kütüphanenin package.json dosyası. Kopyala yapıştır yapmadan, oluşturduğunuz projedeki default dosya ile karşılaştırıp, kendi kütüphanenize göre bir package.json oluşturun.

{
"name": "@digieggs-rn-country-code-picker", // Paketinizin ismi
"version": "1.0.0", // Paketinizin versiyonu. 1.0.0 ile başlayıp semantic olarak artırıyoruz. Oraya da değineceğim.
"main": "lib/module/index.js", // paketimiz built edildikten sonraki entry pointi
"module": "lib/module/index.js", // entry point
"react-native": "src/index.ts", // entry point
"types": "lib/typescript/index.d.ts", // Paketimizin type tanımlamaları
"description": "A searchable dropdown component to select a country code for your phone number input.", // Paketinizin NPM'de görünecek olan kısa açıklaması
"files": [
"lib/",
"src/"
], // build için gerekli dosya konumları
"keywords": [
"react-native",
"country",
"country-code",
"dialing code",
"picker",
"mobile",
"ios",
"android"
], // Paketimizin bulunabilmesi için anahtar kelimeler
"bugs": {
"url": "https://github.com/DIGIEGGS/rn-country-code-picker/issues"
},
"scripts": {
"android": "react-native run-android",
"ios": "react-native run-ios",
"start": "react-native start",
"test": "jest",
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
"prepare": "bob build" // Paketimizi build edecek olan komut
},
"dependencies": {
"react": "16.13.1",
"react-native": "0.63.3",
"react-native-svg": "^12.1.0" // Kullandığım iconlar için react-native-svg paketini yükledim
},
"devDependencies": {
...
"@react-native-community/bob": "^0.16.2", // Paketimizi build etmek için kullanacağımız kütüphane
},
"peerDependencies": {
"react-native-svg": "^12.1.0"
}, // Buraya, paketin doğru çalışması için zorunlu kıldığımız dependency leri ekliyoruz. Kullanıcı manual olarak yüklemezse hata alır
"repository": {
"type": "git",
"url": "git+https://github.com/DIGIEGGS/rn-country-code-picker"
}, // Paketinizi açık kaynak olarak yayınlayacaksanız, repo detayları
"author": "Fatih Can <contact@fatihcan.dev>", // NPM'de görünmesi için kişisel bilgileriniz
"license": "MIT", // Lisans bilgisi
"@react-native-community/bob": {
"source": "src",
"output": "lib",
"targets": [
"module",
"typescript"
]
} // Paketimizi build edecek olan builder bob için konfigürasyon
}

Package.json dosyasını düzenlemeyi bitirdikten sonra dependencylerimizi kuralım.

yarn

veya

npm install

Buradaki kilit dependency, @react-native-community/bob

https://github.com/callstack/react-native-builder-bob

Bu kütüphane, oluşturduğumuz componentleri / fonksiyonları compile edip, bir klasörün içine type tanımlamalarıyla beraber build ediyor. Benim kütüphanemde bu dosyanın adı, package.json’da output olarak tanımladığım lib klasörü.

Src klasörü

Oluşturacağımız paketteki tüm bileşenleri tutacağımız dosya olan src klasörü oluşturalım. Aşağıdaki gibi bir klasör yapısı işinizi kolaylaştıracaktır.

Ana componentimizi oluşturduktan sonra ise index.ts dosyasından aşağıdaki gibi export ediyoruz.

export { default as CallingCodePicker } from './CallingCodePicker';

Gerekli ignore dosyalarını da oluşturalım.

.gitignore

...

# generated files by bob
lib/

.eslintignore

node_modules/

# generated files by bob
lib/

.npmignore

tsconfig.json
src

# Logs
*.log
npm-debug.log

# Dependency directory
node_modules

# Runtime data
tmp

Kütüphanemizi build edelim

Aşağıdaki komut, builder bob’ı tetikleyecek ve kütüphanemizi build edecek.

yarn run prepare

Aşağıdaki resimdeki logları görüyorsanız, paketimiz başarıyla build edildi ve test edilmeye hazır.

Kurulum testi

Aşağıdaki komut, kütüphanemizi, yarn veya npm ile kurulabilen bir .tgz dosyası haline getirecek.

npm pack

Sol tarafta bir .tgz dosyası görüyorsanız işlem başarılı demektir. Dosyayı masaüstüne alıp, kurulumunu test etmek için yeni bir React Native projesi initialize edelim.

Projeyi oluşturduktan sonra, aşağıdaki komutu, dosya konumunu kendi .tgz dosyanıza göre değiştirip çalıştırın.

npm install C:\Users\digieggs\Desktop\digieggs-rn-country-code-picker-1.0.4.tgz

veya

yarn add C:\Users\digieggs\Desktop\digieggs-rn-country-code-picker-1.0.4.tgz

Kurulum başarılı olduysa, componentimizi aşağıdaki şekilde import edip kullanabiliriz.

import { CallingCodePicker } from '@digieggs/rn-country-code-picker'

Paketimizi yayınlama

Şu ana kadar herhangi bir yerde sorun yaşamadıysanız, paketimizi yayınlamaya hazırız. Aşağıdaki komut ile paketimizi yayınlayacağımız npm hesabını tanımlayacağız.

npm adduser

Eğer bir npm hesabınız yoksa şuradan kayıt olabilirsiniz.

Paketinizi bir organizasyon adı altında yayınlamak istemiyorsanız aşağıdaki komutu çalıştırın.

npm publish

Paketiniz scoped olacaksa yani benim gibi şirketinizin veya başka bir organizasyon adı altında yayınlamak istiyorsanız önce şu komutu çalıştırın.

npm config set scope <org-name> // e.g: @digieggs

Scoped paketler private olarak yayınlanır. Public olarak yayınlamak istiyorsak şu komutu çalıştırın.

npm publish --access public

Vee tebrikler! 🥳 Paketimiz yayınlandı ve aşağıdaki komutlar ile her yerden yüklenmeye hazır.

npm install <package_name>

veya

yarn add <package_name>

Paketinizde herhangi bir değişiklik yapacağınız zaman ise semantic versiyon artırma ilkelerine göre hareket etmelisiniz.

Sonuç

İlk NPM paketinizi yayınladınız. Her şey gibi bu da biraz zaman aldı fakat yeni bir şey öğrenmiş oldunuz. Paketinizi kullananlar olduğunu görünce bu çabaya değecek 🙂

Herhangi bir sorunuz olursa yorum yazmaktan çekinmeyin. Yeni yazılarda görüşmek üzere. Hoşçakalın! 👋

--

--