再利用可能なSvelteコンポーネント:誰も怪我をしないように

再利用可能なSvelteコンポーネント:誰も怪我をしないように







コンポーネントフレームワークは、名前に関係なく、コミュニティがプロジェクトに簡単に埋め込むことができるパブリックコンポーネントを作成しない限り、純粋にニッチな使用領域を離れることはありません。







過去1年半にわたって、Svelteフレームワーク用に多くの異なるコンポーネントがすでに作成されており、NPMGitHub、または公式リストにあります。残念ながら、それらのすべてが適切に「調理」されているわけではなく、それらを使用すると、アプリケーションバンドルが必要以上に膨らむことがあります。そして、その作者はパッケージの準備が苦手で、いくつかの重要な点を見逃しているため、そのようなパッケージを使用することは単に不可能です。







この記事では、Svelteコンポーネントを使用してnpmパッケージを作成および公開する方法を紹介します。これにより、予期しない問題から誰もが頭痛の種にならずに使用できるようになります。







コンポーネントを作成する



, , . . , . 'dayjs'



.







アニメーション時計







. , npm-:







  npm init
      
      





, . , Svelte-, svelte-



, , , svelte-clock-demo



. , . , . , Enter.







, package.json



, components



, 'App.svelte'



,'Sign.svelte'



'flip.js'



.







ファイルのリスト







, :







  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, , .







現在のファイル構造







Readme.md



README.md



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









NPM. , , node_modules



. esbuild.js



, . .npmignore



, . — esbuild.js



. , .







.Npmignoreコンテンツ







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';
      
      







この記事では、テストのトピックや、コンポーネント自体の開発プロセスの構成については触れませんでした。ただし、プロジェクトでそれらを無視しないでください。これらがないと、バグの数を最小限に抑えて高品質のパッケージを作成することはほとんど不可能です。







コンポーネントの公開、その使用、または一般的なSvelteフレームワークについて質問がある場合は、TelegramのSvelteコミュニティのロシア語チャットでいつでも回答を得ることができます








All Articles