はじめに
kintoneは手軽に業務アプリを構築できるプラットフォームとして人気がありますが、自由度が高い反面、保守性や拡張性に課題を抱えがちです。特に、開発が進むにつれてコードが肥大化し、イベント処理の迷路に迷い込み、複数アプリ連携で泥沼化するケースも…。
今回は、kintone開発でよくあるアンチパターンを取り上げ、それぞれのリファクタリング例や解決策を紹介します。
お知らせ①
🌟無料&登録不要でプラグインのお試しが可能!🌟
kintoneユーザーの皆さん!
エムザスのkintoneプラグインはもう試しましたか?🤔
エムザスでは以下のようなプラグインを開発しています!👇
デモ環境で、ほとんどの機能が今すぐお試しいただけます✨
さらに、お客様のドメインで無料で3ヶ月間、すべての機能を試すこともできます!🎉
それでは、本題に入ります!
💥 アンチパターン1:複雑すぎるイベント処理
症状:
-
kintone.events.on()
が10行以上並ぶ -
同じイベントで複数処理が動くが、順序依存になっている
-
Promise
チェーンやasync/await
の整合性が取れていない
問題点:
-
修正の影響範囲が読みづらい
-
イベントフローの把握が困難
-
バグの温床になりやすい
🩹解決策:
✅ 共通処理を関数に分離:
function validateInput(event) {
// 入力チェック
return event;
}
function formatValues(event) {
// 値の整形
return event;
}
kintone.events.on('app.record.create.submit', function(event) {
validateInput(event);
formatValues(event);
return event;
});
✅ イベント定義の一元管理:
const EVENT_TYPES = [
'app.record.create.submit',
'app.record.edit.submit',
];
kintone.events.on(EVENT_TYPES, async (event) => {
try {
await doSomething(event);
return event;
} catch (e) {
event.error = '処理中にエラーが発生しました';
return event;
}
});
💥 アンチパターン2:DOM直叩き
症状:
document.querySelector()
やgetElementsByClassName()
を多用setTimeout()
で描画タイミングを調整している- kintone UI Component未使用
問題点:
- kintoneのDOM構造変更に弱い
- スタイリングの破綻リスクが高い
- 非推奨の非公式手法
🩹解決策:
✅ kintone UI Componentの活用:
import { Button } from '@kintone/kintone-ui-component';
const myButton = new Button({
text: '実行',
type: 'submit'
});
myButton.on('click', () => {
alert('クリックされました');
});
kintone.app.record.getSpaceElement('my_space').appendChild(myButton.render());
✅ スペースフィールドの利用:
- DOM操作ではなく、kintoneのUI部品を組み合わせる方向に転換する
💥 アンチパターン3:複数アプリ連携の混乱
症状:
kintone.api()
が乱立し、どこで何を取得しているかわからない- アプリIDがコード内にベタ書き
- 連携先の仕様変更にコードが追従できない
問題点:
🩹解決策:
- テスト・デバッグがしづらい
- アプリ間の依存性が高く、壊れやすい
- 保守の属人化
✅ APIラッパーを作成して集約管理:
const AppAPI = {
getCustomerById: async (id) => {
const appId = 123; // 顧客管理アプリ
const query = `顧客ID = "${id}"`;
const resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
app: appId,
query,
});
return resp.records[0] || null;
}
};
✅ アプリ設定の外部管理(例:定数ファイルで分離):
const APP_IDS = {
CUSTOMER: 123,
ORDER: 456,
};
✅ データ連携の責務分離:
- ロジックを1ファイル1責務で管理
services/
やrepositories/
フォルダでAPI呼び出しを整理
🎯 まとめ:良いkintone開発のために
アンチパターン | 解決の方向性 |
---|---|
イベント処理の複雑化 | 処理の関数化+イベント整理 |
DOMの直叩き | UIコンポーネントの活用 |
アプリ連携の混乱 | API呼び出しの集約+責務分離 |
kintone開発は「とりあえず動く」から始められる反面、スケールすると破綻しやすい側面もあります。小さなアンチパターンを放置せず、設計の見直しやリファクタリングを習慣化することで、開発チーム全体の生産性が向上します。
🧰 おすすめリソース
✍️ おわりに
この記事が「気がつけば沼…」になりかけているkintone開発者の一助となれば幸いです。アンチパターンは誰にでも起こりうるもの。大切なのは気づいた時にどう軌道修正するかです。
もしあなたのプロジェクトでも「これ、まずいかも…?」という兆候があれば、早めに見直しを始めましょう 💪