📦

npmパッケージを公開してみよう!

2023/04/09に公開

こんにちは、株式会社palanxR事業部 でエンジニアをやっている 笹井 です。

概要

はじめてnpmパッケージを作成したので、その手順を整理しました。
npm: https://www.npmjs.com/package/@sasapanchama/joystick
cdn: https://cdn.jsdelivr.net/npm/@sasapanchama/joystick@1.0.0/dist/cdn.bundle.js
GitHub: https://github.com/sasapanchama/joystick

下記については記載していません。今後追加したいです。

  • バッジの追加
  • ライセンスの追加

手順

準備

開発ディレクトリの作成

mkdir demo-package
cd demo-package

npmユーザーの作成

npm adduser

gitの初期化

git init
/.vscode
/dist
/node_modules

npmの初期化

// NOTE: パッケージ名の被り防止のためにスコープの設定を追加
npm init --scope=@your-npm-name
/.vscode
/node_modules
/src
tsconfig.json
jest.config.json
webpack.config.json

パッケージのインストール

npm i typescript
// NOTE: テストに使用するパッケージのインストール
npm i -D @types/jest @types/jsdom jest jest-environment-jsdom jsdom ts-jest
// NOTE: 検証およびCDNに使用するパッケージのインストール
npm i -D ts-loader webpack webpack-cli webpack-dev-server 
  ...
  "scripts": {
    "start": "tsc && webpack serve",
    "build": "tsc && webpack",
    "prepare": "npm run build",
    "test": "jest"
  },
  ...

TypeScriptの設定

{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "declaration": true,
    "sourceMap": true,
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*.ts"],
  "exclude": ["dist", "node_modules", "test"]
}

Jestの設定

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'jsdom'
};

webpackの設定

const path = require('path');

module.exports = {
  mode: 'production',
  entry: './src/cdn.ts',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'cdn.bundle.js',
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
    ],
  },
  resolve: {
    extensions: ['.ts', '.js'],
  },
  devServer: {
    static: {
      directory: path.join(__dirname, ''),
    },
    port: 3000,
    hot: true,
    open: true,
  },
};

開発

ファイルの作成

mkdir src
touch src/index.ts
touch src/cdn.ts
touch src/DemoPackage.ts
mkdir test
touch test/DemoPackage.test.ts
mkdir cdn
touch cdn/index.html

/src/index.tsの編集

export * from "./DemoPackage";

/src/cdn.tsの編集

import { DemoPackage } from './DemoPackage';
(<any>window).DemoPackage = DemoPackage;

/src/DemoPackage.tsの編集

export class DemoPackage {
  public hello() {
    console.log("Hello");
  }
}

/test/DemoPackage.test.tsの編集

// NOTE:

/cdn/index.htmlの編集

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>DemoPackage Example</title>
</head>
<body>
  <div id="container"></div>
  <script src="../dist/cdn.bundle.js"></script>
  <script>
    const demoPackage = new DemoPackage();
    demoPackage.hello();
  </script>
</body>
</html>

検証

npm start

公開

npm build
npm publish --access=public
npm: https://www.npmjs.com/package/@{{ your-npm-name }}/{{ your-package-name }}
cdn: https://cdn.jsdelivr.net/npm/@{{ your-npm-name }}/{{ your-package-name }}@{{ version }}/dist/cdn.bundle.js

参考

https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2
https://zenn.dev/k0kishima/articles/d75f4dc5bd1a26
https://zenn.dev/nino_cast/articles/98a0a87f58026f
https://github.com/alexjoverm/typescript-library-starter

Discussion