kintoneプラグイン開発環境構築メモ
プラグインの下地を作る
create-pluginに沿う
最新のNode.jsを入れる(僕はasdf使ってる)
asdf plugin-update --all
asdf install nodejs latest
asdf global nodejs latest
npm install -g @kintone/create-plugin
create-kintone-plugin <plugin_name>
もろもろ説明などを入力し、
- モバイルページをサポートしますか?
- 一旦No
- @kintone/plugin-uploaderを使いますか?
- Yes
create-plugin終わり
以降は作成したディレクトリで作業をする(ついでにgitも設定)
cd <project_name>
git init
最新のNode.jsを指定してバージョン確認
asdf local nodejs latest
node --version
#=> v21.6.0
ここまでで、ディレクトリ構成こんな感じ
スクショ
ファイルツリー
<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
Webpackを導入する
webpack-plugin-kintone-pluginに沿う
npm install --save-dev @kintone/webpack-plugin-kintone-plugin webpack webpack-cli
mkdir plugin
ファイルたちの書き換え
mv src/manifest.json plugin/
touch 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'
}),
],
};
"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"
},
mv src/css plugin/
mv src/html plugin/
mv src/image plugin/
ビルドしてみる
npm run build
webpack-plugin-kintone-plugin終わり
ここまででディレクトリ構成こんな感じ
スクショ
ファイルツリー
<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
@kintone/plugin-uploader向けの設定をする
インストールはすでにされている
コマンド実行時、kintoneのURLとログイン情報を入力するのが面倒なので、.envファイルを作る
touch .env
KINTONE_BASE_URL=<kintoneのURL>
KINTONE_USERNAME=<ログイン名>
KINTONE_PASSWORD=<パスワード>
dotenv-cliというライブラリを使って.envファイルを読み込む
npm install --save-dev dotenv-cli
"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"
},
アップロードテスト
npm run upload
(ファイルの更新を検知して自動アップロードするので、終了するにはCtrl+C)
@kintone/plugin-uploader終わり
ここまでのディレクトリ構成
上のスクショに.envが増えただけ(.eslintrc.tsの上)
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"
}
}
TailwindcssとDaisyUIを導入
npm install --save-dev tailwindcss daisyui
tailwindの設定ファイルたち
npx tailwindcss init -p
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./plugin/html/*.html'],
theme: {
extend: {},
},
plugins: [
require('daisyui')
],
darkMode: 'class',
daisyui: {
themes: ['light'],
}
}
webpackでCSSを読み込むための設定
mkdir -p src/css
touch src/css/index.css
@tailwind base;
@tailwind components;
@tailwind utilities;
...
entry: {
...
+ css: './src/css/index.css',
},
...
+ module: {
+ rules: [
+ {
+ test: /\.css$/,
+ use: ['css-loader', 'postcss-loader']
+ },
+ ]
+ },
...
スタイルの内容もJSファイルになっちゃうのでスタイルはJSファイルから分離してCSSファイルとなるようにする
+CSSを最小化する
+分離元のJSファイルが空のまま残ってしまうので、空のJSファイルを削除する
npm install --save-dev css-minimizer-webpack-plugin mini-css-extract-plugin webpack-remove-empty-scripts
...
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()],
+ },
};
忘れもの
npm install --save-dev css-loader postcss-loader autoprefixer
生成されるファイルなどはここで出揃ったので、.gitignore整理
touch .gitignore
/node_modules/
/.env
/plugin/js/*
!/plugin/js/.gitkeep
/plugin/css/index.css
/private.ppk
忘れ物
touch plugin/js/.gitkeep
plugin/js/
が空になってしまうとgitに入ってくれないので、.gitgkeepを入れる
(空のディレクトリをgitに含めるための慣例ぽい)
次はVue.jsを入れる
(プラグイン設定画面で使うため)
(メモ)
Vueに伴って入ることになる(予定の)パッケージたち
以前開発した環境と、今の差分
- expose-loader
- vue-loader
- vue-template-compiler
- vue
- expose-loader
この子が謎
Vueインストール
npm install vue
npm install --save-dev vue-loader vue-template-compiler
Vueをwebpackで利用するための設定
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'
+ },
],
},
}
/** @type {import('tailwindcss').Config} */
module.exports = {
- content: ['./plugin/html/*.html'],
+ content: ['./plugin/**/*.{html,js,vue}'],
...
}
npm run build
は成功
環境構築終わり
プラグインをパッケージする処理の設定変更
{
...
"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"
],
...
},
...
}
kintone
の警告をなくすために型情報を入れる
npm install --save-dev @kintone/dts-gen