Riferimento:
- Initializing The Project
- Storybook
- Component Library Source Code
- Rollup
- Publish To NPM
- Creare cartella di progetto
- Entrare nella cartella creata con Terminale run:
npm init
Crea package.json- package name: (nome cartella default) cambiare il nome del progetto facoltativo -> ok
- version: (1.0.0) -> ok
- description: aggiungere breve descrizione progetto -> ok
- entry point: (index.js) / in seguito verrà modificata per ora si puo lasciare cosi.
- author: "inserire nome"
- licence: (ISC default) - Consigliano di mettere MIT (io non l'ho fatto)
-
Creare scafholding di progetto:
- creare cartella "src"
- dentro "src" creare cartella "components"
- dentro "components" creare file index.js
export * from './components/ParentComponent'
esporta il componente padre oppure aggiungere altre eventuali esportazioni se necessario
-
installare react e react-dom
npm install --save-dev react react-dom
- aggiungere al package.json "peerDependecies": {cp react e react-dom}
devDependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"peerDependecies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
Serve a non creare collisioni tra le varie versioni di react nell'eventualità che qualcuno installa questo componente con una versione di react differente
Serve a visualizzare il componente in fase di sviluppo evitando di fare "build" e "publish su npm" per ogni modifica effettuata.
-
install STORYBOOK (non funziona con node v18 usato con node v16)
npx sb init
- Terminale: "Detecting project type ok" - conferma che ha trovato react
- aggiunge diverse devDep di babel
- il comando per lasciare il progetto è:
npm run storybook
(da usare in seguito) - nella cartella di progetto (root) crea cartella .storybook con dentro file di configurazione generati automaticamente dentro "src" crea cartella "stories" con dentro file di esempio (in questo caso sono stati eliminati in quanto non è un tutorial su Storybook)
Creare una cartella (in components) per ogni componente che si vuole utilizzare ES. ParentComponent e Child
Src | . | . | . |
---|---|---|---|
. | components | . | |
. | . | Child | |
. | . | . | Child.jsx |
. | . | . | index.js |
. | . | ParentComponent | |
. | . | . | ParentComponent.jsx |
. | . | . | index.js |
in ogni cartella creare due file index.js - NomeComponent.jsx
- index.js 'per l'esportazione del componente'
- NomeComponent.jsx 'il componente e la sua logica'
export * from './ParentComponent'
export const ParentComponent = () => {
return (
<div>
<h2>Hello Parent</h2>
</div>
);
}
Dentro cartella src nel file index.js aggiungere:
export * from './components/ParentComponent'
Per esportare i nostri componenti (ParentComponent e Child) nel caso in cui ci fossero più componenti da esporare assicurati di farlo in questo file
solitamente il file "index.js" nelle normali applicazioni React serve per importare "App" (router - store etc) in questo caso sarà il file NomeStoria.stories.js a simulare "App"
Dentro cartella "stories" creare file NomeStoria.stories.js + file "style.css"
import React from "react";
import {storiesOf} from "@storybook/react";
import { ParentComponent } from "../components/ParentComponent";
import './style.css'
const stories = storiesOf('App test', module);
stories.add('App', () => {
return(<ParentComponent/>)
})
Il secondo parametro della funzione (stories.add('Param1', Param2)) può essere interpretato come un normale componente react (si possono utilizzare hook, funzioni, props etc etc)
Per controllare il corretto funzionamento di storybook run
npm run storybook
Potrebbe aprire ill broswer su porta 192.168.0.1/6006
sostituire con http://localhost:6006
potrebbe essere necessario fare diverse storie per più componenti
Esempio codice:
- https://github.com/patriziosbr/react-pwr2 - Repo personale privata richiedere accesso a patriziosbr
- https://github.com/portexe/react-pwr - Repo pubblica del video tutorial
Rollup.js serve a compilare il progetto
npm install rollup rollup-plugin-babel @rollup/plugin-node-resolve rollup-plugin-peer-deps-external --save-dev
Dipendenze aggiuntive:
npm install --save-dev @babel/preset-react
npm install --save-dev rollup-plugin-postcss
npm install --save-dev rollup-plugin-terser
npm install --save-dev rollup-plugin-babel
Nella root project fuori da src
Creare file rollup.config.js
per far funzionare il progetto ho modificato l'estenzione del file in
rollup.config.mjs
(m sta per modulo)
import babel from 'rollup-plugin-babel';
import resolve from '@rollup/plugin-node-resolve';
import external from 'rollup-plugin-peer-deps-external';
import { terser } from 'rollup-plugin-terser';
import postcss from 'rollup-plugin-postcss';
export default [
{
input: './src/index.js',
output: [
{
file: 'dist/index.js',
format: 'cjs', //commonjs
},
{
file: 'dist/index.es.js', //da studiare
format: 'es',
exports: 'named',
}
],
plugins: [
postcss({
plugins: [],
minimize: true,
}),
babel({
exclude: 'node_modules/**',
presets: ['@babel/preset-react']
}),
external(),
resolve(),
terser(), //per minify
]
}
];
Andare nel package.json aggiungere scripts -> "build-lib": "rollup -c" "module": "dist/index.es.js", modificare main -> "main": "dist/index.js":
{
"name": "pu-react-pwr2",
"version": "1.7.2",
"description": "test publish react component",
"main": "dist/index.js", //edit me
"module": "dist/index.es.js", //add me
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"storybook": "start-storybook -p 6006",
"build-storybook": "build-storybook",
"build-lib": "rollup -c" //add me
},
"author": "yourname",
//resto del codice
npm run build-lib
- Creare account su npm
- nella root project folder run:
npm adduser
Username: inserire username Password: pass Email: mail OTP Code via mail: 0000000
npm publish