Upgrade to Pro — share decks privately, control downloads, hide ads and more …

文脈の多いこのご時世にユーザーフレンドリーなモジュールをnpm-publish - Kyoto.js16

C6b1c59927729394dcc84b1b8bc86394?s=47 1natsu
April 27, 2019

文脈の多いこのご時世にユーザーフレンドリーなモジュールをnpm-publish - Kyoto.js16

Kyotojs.16のスライドです。

こちらからでも見れます
https://slides.1natsu.net/slides/strategy-and-knowledge-for-moderately-good-npm-publish/#0

C6b1c59927729394dcc84b1b8bc86394?s=128

1natsu

April 27, 2019
Tweet

More Decks by 1natsu

Other Decks in Technology

Transcript

  1. 文脈の多いこのご時世に ユーザーフレンドリーなモジュールを npm­publish Kyoto.js 16

  2. None
  3. このスライドの方針 今後を見据えてモジュールを作りたいが がんばりたくもない なんか現状いい感じにしとく方法を模索している

  4. CAVEAT ベストプラクティスではない いろんな文脈のこまごまとした話 しません experimental な内容が含まれる なんか間違ってるかも 事情が変わるかも

  5. CAVEAT ケース・バイ・ケースなので 諦めるという選択もあり 個々のケースの詳細なコード説明 あんまりしません

  6. 文脈

  7. 形式 CommonJS ESModule AMD UMD etc...

  8. バンドラ Browserify Webpack Rollup ...etc

  9. 拡張子 .js .ts .mjs

  10. 文脈が多い 誰がどこでどういう風に使うのかが多岐にわたる

  11. 提供者として どう吐き出しておけばよい?

  12. おさらい package.json のフィールド指定

  13. Package.json の一部 型定義ファイルの指定 ­ フィールド名は"types" でもOK "typings": "dist/index.d.ts", // 型定義

    { "main": "dist/index.js", // CommonJS "module": "dist/index.es.js", // ESModule "browser": "dist/index.umd.js", // UMD "unpkg": "dist/index.umd.js", // unpkg(UMD) "jsdelivr": "dist/index.umd.js", // jsDelivr(UMD) "files": ["dist"], // whitelist 形式でnpm に実際に上がるファイルを指定 "sideEffects": false // global に影響するポリフィルのようなものを含む場合はtrue }
  14. なんかいろいろ用意しないといけ ないっすね

  15. Case.1

  16. 『やらない』という施策

  17. index.js から素朴に module.exports や! アリといえばあり

  18. 失うもの TreeShaking CodeSpliting 人類の時間 etc...

  19. 言われるかもしれない

  20. 『Please support TypeScript 』

  21. d.ts 作って対応 型定義欲しい気持ちはユーザー目線で見ると 『わかる』

  22. バージョンアップで d.ts 追従させるのしんどい ユーザーから PR が仮に飛んできてもしんどい

  23. TS で最初から書くかという気持ちになってしまう

  24. TS で書く

  25. c.f. TypeScript 再入門 ― 「がんばらない TypeScript 」で、JavaScript を“ 柔らかい” 静的型付き言

    語に ­ https://employment.en­japan.com/engineerhub/entry/2019/04/16/103000
  26. Case.2

  27. TS で書いて よっしゃできたぞってなって

  28. どう吐き出すか なにかしらコンパイルが必要

  29. いろいろ考え出してしまう Rollup とかWebpack とか… TS 向けのplugin/loader Babel7 babel どこで動かそう

  30. 見返りがあるならガンバリで config 書いてもよい が… 質素なモジュールではしんどい config のメンテな~

  31. TS のコンパイラで素朴に吐く

  32. npm­scripts に書く tsconfig.prod.json をベースにして変えたいオプションを引数指定する "build:esnext": "tsc --module esnext --target esnext

    --outDir dist/es --project tsconfig.prod.json", "scripts": { "build": "npm run build:esnext && npm run build:esm && npm run build:cjs", "build:esm": "tsc --module esnext --target es5 --outDir dist/esm --project tsconfig.prod.json", "build:cjs": "tsc --module commonjs --target es5 --outDir dist/cjs --project tsconfig.prod.json" }
  33. Case.3

  34. もうちょいなんかラクしつつ いい感じになって欲しい ツールに頼る作戦

  35. モジュール吐き出し用のバンドラ いろいろある いくつか見てよさげなやつを紹介

  36. Microbundle https://github.com/developit/microbundle developit 氏が主に作っている TS 対応 Rollup をラップ zero­config etc...

  37. Microbundle(v.0.11.0) リポジトリdocs から拝借 { "source": "src/foo.js", "main": "dist/foo.js", "module": "dist/foo.mjs",

    "unpkg": "dist/foo.umd.js", "scripts": { "build": "microbundle", "dev": "microbundle watch" } }
  38. Bili https://github.com/egoist/bili egoist 氏が主に作っている 別にVue 専用ではない microbundle に似ているが オプショナル& プラガブル

    CSS まわりのサポートも厚い
  39. @pika/pack https://github.com/pikapkg/pack 全部入り 野望という感じ Config が必要 必要なプラグインをnpm install して使う publish

    用のpackage.json 入りのディレクトリを作ってくれる publish するためのcli も付いてくる
  40. 適材適所・十人十色なので 規模感と自分がどこまでやりたいかによるので ベストプラクティスはない