Closed34

kintoneプラグイン開発環境構築メモ

ピン留めされたアイテム
akiraakira

やったコマンド・ファイル編集などを全てメモっていく

akiraakira

補足
"shell" と書いてあるコードブロックはそのままターミナルに打ち込む

akiraakira

最新のNode.jsを入れる(僕はasdf使ってる)

shell
asdf plugin-update --all
asdf install nodejs latest
asdf global nodejs latest
akiraakira
shell
npm install -g @kintone/create-plugin
create-kintone-plugin <plugin_name>

もろもろ説明などを入力し、

  • モバイルページをサポートしますか?
    • 一旦No
  • @kintone/plugin-uploaderを使いますか?
    • Yes
akiraakira

create-plugin終わり

以降は作成したディレクトリで作業をする(ついでにgitも設定)

shell
cd <project_name>
git init

最新のNode.jsを指定してバージョン確認

shell
asdf local nodejs latest  
node --version
#=> v21.6.0
akiraakira

ここまでで、ディレクトリ構成こんな感じ

スクショ

ファイルツリー
<plugin_name>/
├── node_modules
├── scripts/
│   └── npm-start.js
├── src/
│   ├── css/
│   │   ├── 51-modern-default.css
│   │   ├── config.css
│   │   └── desktop.css
│   ├── html/
│   │   └── config.html
│   ├── image/
│   │   └── icon.png
│   ├── js/
│   │   ├── config.js
│   │   └── desktop.js
│   └── manifest.json
├── .eslintrc.js
├── .tool-versions
├── package.json
├── package-lock.json
└── private.ppk
akiraakira
shell
npm install --save-dev @kintone/webpack-plugin-kintone-plugin webpack webpack-cli
akiraakira

ファイルたちの書き換え

shell
mv src/manifest.json plugin/
shell
touch webpack.config.js
webpack.config.js
const path = require('path');
const KintonePlugin = require('@kintone/webpack-plugin-kintone-plugin');

module.exports = {
  // webpack でバンドルする js のファイルを指定する
  entry: {
    desktop: './src/js/desktop.js',
    // mobile: './src/js/mobile.js',
    config: './src/js/config.js',
  },
  // webpack でバンドルしたファイルが出力する先を指定する
  output: {
    path: path.resolve(__dirname, 'plugin', 'js'),
    filename: '[name].js',
  },
  // プラグインのパッケージングに必要なファイルのパスを設定する
  plugins: [
    new KintonePlugin({
      manifestJSONPath: './plugin/manifest.json',
      privateKeyPath: './private.ppk',
      pluginZipPath: './dist/plugin.zip'
    }),
  ],
};
package.json
  "scripts": {
-   "start": "node scripts/npm-start.js",
-   "develop": "npm run build -- --watch",
-   "build": "kintone-plugin-packer --ppk private.ppk --out dist/plugin.zip src",
+   "start": "npm run develop",
+   "develop": "webpack --mode development --watch",
+   "build": "webpack --mode production",
    "lint": "eslint src",
    "upload": "kintone-plugin-uploader dist/plugin.zip --watch --waiting-dialog-ms 3000"
  },
akiraakira

webpack-plugin-kintone-plugin終わり

akiraakira

ここまででディレクトリ構成こんな感じ

スクショ

ファイルツリー
<plugin_name>/
├── dist/
│   └── plugin.zip  
├── node_modules
├── plugin/
│   ├── css/
│   │   ├── 51-modern-default.css
│   │   ├── config.css
│   │   └── desktop.css
│   ├── html/
│   │   └── config.html
│   ├── image/
│   │   └── icon.png
│   ├── js/
│   │   ├── config.js
│   │   └── desktop.js 
│   └── manifest.json	
├── scripts/
│   └── npm-start.js
├── src/
│   └── js/
│       ├── config.js
│       └── desktop.js
├── .eslintrc.js
├── .tool-versions
├── package.json
├── package-lock.json
├── private.ppk
└── webpack.config.js
akiraakira

@kintone/plugin-uploader向けの設定をする
インストールはすでにされている

コマンド実行時、kintoneのURLとログイン情報を入力するのが面倒なので、.envファイルを作る

shell
touch .env
.env
KINTONE_BASE_URL=<kintoneのURL>
KINTONE_USERNAME=<ログイン名>
KINTONE_PASSWORD=<パスワード>

dotenv-cliというライブラリを使って.envファイルを読み込む

npm install --save-dev dotenv-cli
package.json
  "scripts": {
    "build": "webpack --mode production",
    "develop": "webpack --mode development --watch",
    "start": "npm run develop",
    "lint": "eslint src",
-   "upload": "kintone-plugin-uploader dist/plugin.zip --watch --waiting-dialog-ms 3000"
+   "upload": "dotenv -- kintone-plugin-uploader dist/plugin.zip --watch --waiting-dialog-ms 3000"
  },
akiraakira

アップロードテスト

shell
npm run upload

(ファイルの更新を検知して自動アップロードするので、終了するにはCtrl+C)

akiraakira

@kintone/plugin-uploader終わり

akiraakira

ここまでのディレクトリ構成
上のスクショに.envが増えただけ(.eslintrc.tsの上)

package.jsonの内容
package.json
{
  "name": "<plugin_name>",
  "version": "0.1.0",
  "scripts": {
    "build": "webpack --mode production",
    "develop": "webpack --mode development --watch",
    "start": "npm run develop",
    "lint": "eslint src",
    "upload": "dotenv -- kintone-plugin-uploader dist/plugin.zip --watch --waiting-dialog-ms 3000"
  },
  "devDependencies": {
    "@cybozu/eslint-config": "^22.0.2",
    "@kintone/plugin-packer": "^8.0.3",
    "@kintone/plugin-uploader": "^9.0.2",
    "@kintone/webpack-plugin-kintone-plugin": "^8.0.4",
    "eslint": "^8.52.0",
    "npm-run-all": "^4.1.5",
    "webpack": "^5.89.0",
    "webpack-cli": "^5.1.4"
  }
}
akiraakira

TailwindcssとDaisyUIを導入

shell
npm install --save-dev tailwindcss daisyui
akiraakira

tailwindの設定ファイルたち

shell
npx tailwindcss init -p
tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ['./plugin/html/*.html'],
  theme: {
    extend: {},
  },
  plugins: [
    require('daisyui')
  ],
  darkMode: 'class',
  daisyui: {
    themes: ['light'],
  }
}
akiraakira

webpackでCSSを読み込むための設定

shell
mkdir -p src/css
touch src/css/index.css
index.css
@tailwind base;
@tailwind components;
@tailwind utilities;
webpack.config.js
  ...
  entry: {
  ...
+   css: './src/css/index.css',
  },
  ...
+ module: {
+   rules: [
+     {
+       test: /\.css$/,
+       use: ['css-loader', 'postcss-loader']
+     },
+   ]
+ },
  ...
akiraakira

スタイルの内容もJSファイルになっちゃうのでスタイルはJSファイルから分離してCSSファイルとなるようにする
+CSSを最小化する
+分離元のJSファイルが空のまま残ってしまうので、空のJSファイルを削除する

shell
npm install --save-dev css-minimizer-webpack-plugin mini-css-extract-plugin webpack-remove-empty-scripts
webpack.config.js
...
  const KintonePlugin = require('@kintone/webpack-plugin-kintone-plugin');
+ const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
+ const MiniCssExtractPlugin = require('mini-css-extract-plugin');
+ const WebpackRemoveEmptyScriptsPlugin = require('webpack-remove-empty-scripts');

  module.exports = {
    entry: {
-     desktop: './src/js/desktop.js',
-     // mobile: './src/js/mobile.js',
-     config: './src/js/config.js',
-     css: './src/css/index.css',
+     'js/desktop': './src/js/desktop.js',
+     // 'js/mobile': './src/js/mobile.js',
+     'js/config': './src/js/config.js',
+     'css/index': './src/css/index.css',
    },
    output: {
-     path: path.resolve(__dirname, 'plugin', 'js'),
+     path: path.resolve(__dirname, 'plugin'),
      filename: '[name].js',
    },
    plugins: [
      ...
+     new MiniCssExtractPlugin({
+       filename: '[name].css'
+     }),
+     new WebpackRemoveEmptyScriptsPlugin(),
    ],
    module: {
      rules: [
        {
          test: /\.css$/,
-         use: ['css-loader', 'postcss-loader']
+         use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader']
        },
      ],
    },
+   optimization: {
+     minimizer: [new CssMinimizerPlugin()],
+   },
  };
akiraakira

忘れもの

shell
npm install --save-dev css-loader postcss-loader autoprefixer
akiraakira

生成されるファイルなどはここで出揃ったので、.gitignore整理

shell
touch .gitignore
.gitignore
/node_modules/
/.env
/plugin/js/*
!/plugin/js/.gitkeep
/plugin/css/index.css
/private.ppk
akiraakira

忘れ物

shell
touch plugin/js/.gitkeep

plugin/js/が空になってしまうとgitに入ってくれないので、.gitgkeepを入れる
(空のディレクトリをgitに含めるための慣例ぽい)

akiraakira

(メモ)

Vueに伴って入ることになる(予定の)パッケージたち
以前開発した環境と、今の差分

  • expose-loader
  • vue-loader
  • vue-template-compiler
  • vue
akiraakira

Vueインストール

shell
npm install vue
shell
npm install --save-dev vue-loader vue-template-compiler
akiraakira

Vueをwebpackで利用するための設定

webpack.config.js
  const WebpackRemoveEmptyScriptsPlugin = require('webpack-remove-empty-scripts');
+ const {VueLoaderPlugin} = require('vue-loader');
+ const webpack = require('webpack');

  module.exports = {
    ...
    plugins: [
      ...
      new WebpackRemoveEmptyScriptsPlugin(),
+     new VueLoaderPlugin(),
+     new webpack.DefinePlugin({
+       __VUE_OPTIONS_API__: false,
+       __VUE_PROD_DEVTOOLS__: true
+     }),
    ],
    module: {
      rules: [
        {
          test: /\.css$/,
          use: ['css-loader', 'postcss-loader']
        },
+       {
+         test: /\.vue$/,
+         loader: 'vue-loader'
+       },
      ],
    },
  }
tailwind.config.js
  /** @type {import('tailwindcss').Config} */
  module.exports = {
-   content: ['./plugin/html/*.html'],
+   content: ['./plugin/**/*.{html,js,vue}'],
    ...
  }
akiraakira

プラグインをパッケージする処理の設定変更

manifest.json
  {
    ...
    "desktop": {
      "js": [
-       "https://js.cybozu.com/jquery/3.3.1/jquery.min.js",
        "js/desktop.js"
      ],
      "css": [
-       "css/51-modern-default.css",
        "css/desktop.css"
      ]
    },
    "icon": "image/icon.png",
    "config": {
      "html": "html/config.html",
      "js": [
-       "https://js.cybozu.com/jquery/3.3.1/jquery.min.js",
        "js/config.js"
      ],
      "css": [
-       "css/51-modern-default.css",
-       "css/config.css"
+       "css/index.css"
      ],
      ...
    },
    ...
  }
akiraakira

kintone の警告をなくすために型情報を入れる

shell
npm install --save-dev @kintone/dts-gen
このスクラップは2ヶ月前にクローズされました