Componente Svelte reutilizable: para que nadie se lastime

Componente Svelte reutilizable: para que nadie se lastime







Los marcos de componentes, independientemente del nombre, nunca abandonarán el área de uso puramente de nicho, a menos que la comunidad cree componentes públicos para ellos que puedan integrarse fácilmente en su proyecto.







Durante el último año y medio, ya se han creado muchos componentes diferentes para el marco Svelte, que se pueden encontrar en NPM , GitHub o en la lista oficial . Desafortunadamente, no todos están "cocidos" correctamente y, a veces, usarlos inflará el paquete de aplicaciones más de lo debido. Y sucede que tales paquetes son simplemente imposibles de usar, porque su autor no es bueno preparando paquetes y se perdió algunos puntos importantes.







En este artículo, le mostraré cómo crear y publicar un paquete npm con un componente Svelte para que todos puedan usarlo sin tener dolores de cabeza por problemas inesperados.







Crea un componente



, , . . , . 'dayjs'



.







Reloj animado







. , npm-:







  npm init
      
      





, . , Svelte-, svelte-



, , , svelte-clock-demo



. , . , . , Enter.







, package.json



, components



, 'App.svelte'



,'Sign.svelte'



'flip.js'



.







lista de archivos







, :







  npm install dayjs
      
      





Svelte-, , . package.json



"main":"index.js",



:







 ...
 "svelte":"components/App.svelte",
 ...
      
      





, , . – ...









, Svelte- c , "svelte"



package.json



. , , - . Svelte .







ES6 Webpack Rollup. JavaScript Svelte-, CSS-, . , svelte



, , svelte/transition



svelte/store



, svelte/internal



. , , Svelte, .







IIFE <script src="...">



. html-, - CDN, jsdelivr.com unpkg.vom. , , , svelte



, – , dayjs



.







. – Webpack, Rollup, Parcel . , esbuild, Go, , tree- . esbuild-svelte



svelte



. dev-:







 npm install --save-dev esbuild esbuild-svelte svelte
      
      





svelte



dev-, Javascript-. , svelte



. , , , , ES6 , . , package.json



peer-.







...,

"peerDependencies": {
  "svelte": "3.x"
},

...
      
      





3.x



, - Svelte, 2 4, ES6 .







, svelte



node_modules



, . NPM 7 .







CDN- . "svelte":...,



package.json



:







    ...
    "module":"dist/clock.mjs",
    "cdn":"dist/clock.min.js",
    "unpkg":"dist/clock.min.js",
    ...
      
      





, CDN . , , Jsdelivr "cdn"



, , . , "unpkg"



.







esbuild



esbuild.js



:







const {build} = require(`esbuild`);
const sveltePlugin = require(`esbuild-svelte`);

//   package.json    pkg
const pkg = require(`./package.json`);

//    Svelte 
const svelte = sveltePlugin({
  compileOptions:{
     //       
    css: true
  }
});

//  IIFE-
build({
  //        package.json
  entryPoints: [pkg.svelte],
  outfile: pkg.cdn,
  format: 'iife',
  bundle: true,
  minify: true,
  sourcemap: true,
  plugins: [svelte],

  //        
  globalName: 'svelteClock',
})

//  ES-
build({
  entryPoints: [pkg.svelte],
  outfile: pkg.module,
  format: 'esm',
  bundle: true,
  minify: true,
  sourcemap: true,
  plugins: [svelte],

  //        
  // dependencies  peerDependencies   package.json
  external: [
    ...Object.keys(pkg.dependencies),
    ...Object.keys(pkg.peerDependencies),
  ]
})
      
      





esbuild .

package.json



"scripts"



esbuild:







  ...
  "scripts": {
    ...
    "build":"node esbuild",
    ...
  }
      
      





:







  npm run build
      
      





dist



sourcemap, , .







Estructura de archivo actual







Readme.md



README.md



, , . , , , , , , . , . svelte-, . - , . , .









NPM. , , node_modules



. esbuild.js



, . .npmignore



, . — esbuild.js



. , .







.Npmignore contenido







npm run build



, dist



. "scripts"



package.json



:







  ...
  "scripts": {
    ...
    "prepublish":"npm run build",
    ...
  }
      
      





, pacakge.json



:







{
  "name": "svelte-clock-demo",
  "version": "1.0.0",
  "description": "Animated clock component for Svelte",
  "svelte": "components/App.svelte",
  "module":"dist/clock.mjs",
  "cdn":"dist/clock.min.js",
  "unpkg":"dist/clock.min.js",
  "scripts": {
    "build":"node esbuild",
    "prepublish":"npm run build",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Vasya Pupkin",
  "license": "ISC",
  "dependencies": {
    "dayjs": "^1.10.4"
  },
  "devDependencies": {
    "esbuild": "^0.8.43",
    "esbuild-svelte": "^0.4.1",
    "svelte": "^3.32.2"
  },
  "peerDependencies": {
    "svelte": "3.x"
  }
}

      
      





, NPM :







 npm login
 npm publish
      
      





NPM . .









. - :







  npm install --save-dev svelte-clock-demo
      
      





Svelte-, :







<script>
    import Clock from 'svelte-clock-demo';
</script>

<Clock background="white" color="black" />
      
      





, Svelte, ES6 , :







import Clock from 'svelte-clock-demo';

new Clock({
  //   DOM,    
  target: document.getElementById('divForClock'),
  //   
  props:{
    background: 'white',
    color: 'black'
  }
})
      
      





CDN. NPM, CDN , jsdelivr.com.







<html>
  <head>
    <title>  </title>
    <!--    CDN -->
    <script src='https://cdn.jsdelivr.net/npm/svelte-clock-demo'></script>
  </head>
  <body>
    <div id="divForClock"></div>
  </body>
  <script>
    //        esbuild
    new svelteClock.default({
      //   DOM,    
      target: document.getElementById('divForClock'),
      //   
      props:{
        background: 'white',
        color: 'black'
      }
    })
  </script>
</html>
      
      







, - . , UI , Input



,Button



, Checkbox



..







App.svelte



, Sign.svelte



. , , - .







, components



index.js



- , .







export {default as Clock} from './App.svelte';
export {default as Sign} from './Sign.svelte';
      
      





"svelte"



package.json



, index.js



.







  ...
  "svelte":"components/index.js",
  ...
      
      





, :







import {Sign} from 'svelte-clock-demo';
      
      







En el artículo, no tocamos el tema de las pruebas, así como la organización del proceso de desarrollo del componente en sí. Pero no debe descuidarlos en sus proyectos, porque sin ellos es casi imposible hacer un paquete de alta calidad con un número mínimo de errores.







Si tiene alguna pregunta sobre la publicación de componentes, su uso o, en general, sobre el marco Svelte, siempre puede obtener respuestas en el chat en ruso de la comunidad Svelte en Telegram .








All Articles