webpack入門〜Babel、Polyfillを導入してkintoneカスタマイズを効率化する
はじめに
kintoneは、Google Chromeや、Safari, Microsoft Edgeなどの主要なブラウザーで動作します。
kintone JavaScript APIを使ってカスタマイズする際は、ブラウザーごとの機能差異を考慮してプログラムを書く必要があります。
BabelやPolifyを使うと、ブラウザーごとの機能差異を埋めることができます。
また、webpackを使うと、BabelやPolifyを扱いやすくなるほか、複数のJavaScriptファイルを1つにまとめることができるなど、さまざまなメリットがあります。
kintoneカスタマイズにwebpackを導入するメリット
BabelとPolyfillについて
JavaScriptは日々進化しており、ES5, ES6(ES2015), ES2016といったバージョンがあることはご存じでしょうか?
JavaScriptの進化には2つの側面があります。
ひとつはプログラミング言語の拡張で、もうひとつは標準ライブラリの拡張です。
しかし、各ブラウザー間でサポートされる機能が異なってしまいます。
参考:
ES6のブラウザ間の実装状況
プログラミング言語の拡張
たとえばES6のJavaScriptではテンプレート文字列という文法を利用できます。
文字列の中で変数を展開できるだけでなく、文字列中に改行が含まれても大丈夫になります。
|
|
プログラムが簡潔にかけて気持ちいいですね!
しかし、このテンプレート文字列はInternet Explorer 11では動作せず、JavaScriptを解釈する時点でエラーになってしまいます。
こういった問題を解決するのが
Babel
です。
ES6のコードをES5で動作するようにコードを変換してくれます。
コード変換の動作はBabelの公式サイトで確認できます。
標準ライブラリの拡張
文法の進化だけでなく、JavaScriptのビルトインオブジェクトライブラリも進化しています。
たとえばES6にはObject.values
という便利メソッドが追加されています。
|
|
ですがこれもInternet Explorer 11では未実装のため動作しません。
こういったブラウザーごとの実装・未実装を埋めてくれるのがPolyfillです。
Polyfillは未実装のメソッドを見つけると、Polyfillライブラリが読み込まれた時点で実装を追加してくれます。
そのため、Internet Explorer 11などの環境でもObject.values
を利用できます。
BabelでPolyfillを利用するには、
@babel/preset-env
と
core-js
を使います。
webpackについて
webpack
はJavaScriptのビルドツールです。
JavaScriptをブラウザーで動かすために必要なライブラリをバンドルしたり、プログラミング言語の変換をします。
webpackはES6で導入された import , export を解釈して、必要なライブラリやモジュールをバンドルしてくれます。
本記事ではwebpackの中にBabelとPolyfillを組み込んで動作する例を解説します。
これで最低限のツールの知識は説明し終えたのでチュートリアルにトライしてみましょう。
チュートリアル
ES6の文法を使ってkintoneカスタマイズの実装をしてみましょう。
このチュートリアルで扱う、node
やnpm
、npx
コマンドは、
Node.js
をインストールすると自動的にインストールされるツールのコマンドです。
なお、Node.jsのインストール手順や、これらのコマンドの詳細は、この記事では説明しません。
Step1 : npmを使ってプロジェクトを初期化する
|
|
以後の作業はプロジェクト・ディレクトリで作業するものとします。
Step2 : webpack, Babelなどのツールをインストールする
|
|
webpack
... webpackの本体webpack-cli
... コマンドラインからwebpackを利用するためのツールwebpack-dev-server
... 開発中プログラムをローカルホスト上でホスティングしてくれる開発ツールbabel-loader
... Babelのwebpackプラグイン@babel/core
... Babelの本体@babel/preset-env
... BabelのJavaScriptの変換ツールcore-js
... JavaScriptの標準ライブラリが定義されておりPolyfillを組み込んで利用できる。
Step3 : webpack.config.jsを配置する
npm init
したのと同じディレクトリにwebpack.config.jsを配置します。
|
|
webpack.config.jsの設定項目
kintoneカスタマイズする上で最低限知っておくと良さそうな設定項目を紹介します。
もっと複雑なこともできますが、詳細は
webpackのドキュメント
を参照してください。
entry
JavaScriptのエントリーポイントを指定します。
kintoneカスタマイズの場合、kintone.events.on
メソッドが書いてあるプログラムになります。
オブジェクトを設定し、サンプルプログラムだと、kintone-create-edit-showのエントリーポイントを作っています。
target
ビルド後のファイルがどの環境に向けたファイルかを指定します。
指定しない場合、デフォルトで ['web']が設定されています(参照:
target
)
ただし、webpack 5でビルドした場合、Internet Explorerに対応していない構文が出力されます。
webpack 5でInternet Explorerに対応する場合には、['web', 'es5']を指定します(上記サンプルのコメントを外してください)。
module
JavaScriptの変換ルールを書きます。
test
の中で指定されている正規表現にマッチした場合、Babelの変換プログラムが動作します。
今回の場合は、.js, mjsにマッチするファイルが読み込まれた場合、Babelによる自動変換の対象として設定しています。
output
ビルドしたJavaScriptを出力するディレクトリを設定します。
path
は出力先のディレクトリ、filename
はファイル名です。
path
がわかりにくいですが、package.jsonが配置されているのと同じディレクトリにdistというディレクトリが作られて、その下にビルドしたJavaScriptが配置されます。
filename
の [name]ですが、entry
で指定したキー名をファイル名として文字列を自動的に設定してくれます。
externals
kintoneのJSカスタマイズではアップロードできるファイルの大きさに制限があります。
一方で、webpackは利用しているライブラリをひとつのファイルにまとめます。
このため、webpackでビルドしたファイルは大きくなりやすい特徴があるため注意してください。
jQueryなどグローバル変数を定義するタイプのライブラリなどをexternals
に設定しておくと、webpackはjQueryがソースコードでimport
されていても無視してくれます。
Step4 : ES6を使ってJSカスタマイズを書いてみよう!
サンプルプログラムではES6で導入された文法やライブラリを使った簡単なプログラムを書いています。
|
|
作業フォルダー内に「src」フォルダーを用意し、「kintone-create-edit-show.js」というファイル名で保存してください。
webpack.config.jsのentryポイントと合わせてください。
Step5 : ビルドしてみよう!
次のコマンドを実行するとwebpackがJavaScriptをビルドしてくれます。
|
|
--mode development
とproduction
が指定可能です。開発中はdevelopment
を指定します。
ビルドが完了するとdistディレクトリにkintone-create-edit-show.jsが作成されているので、アップロードして動作確認してみましょう。
webpack-dev-serverというツールもあります。これは別記事で解説させていただきます。
Step6 : アップロードしてみよう
ビルドしたプログラムをkintoneにアップロードしてみましょう。
kintone-create-edit-show.jsをアップロードします。
jQueryを別途カスタマイズとして登録するのを忘れないようにしてください。
Internet Explorerでも動作するのがわかると思います。
Chromeブラウザーのコンソールから、webpackでビルドしたプログラムを確認してみましょう。
テンプレート文字列が変換されているのを確認できると思います。
Step7 : import、exportを体験してみよう
全角半角を変換するオープンソースライブラリをnpm install
でインストールしてimport
, export
を使って実装してみます。
|
|
全角半角を変換する実装を作成、export
してみます。(src/hankaku.js)
|
|
kintone.events.on
を書くファイルでimport
します。(src/kintone-create-edit-submit.js)
|
|
webpack.config.jsを修正する必要があります。サンプルコードのリポジトリ(後述)にあるので割愛します。
再度ビルドすると2つのファイルが作成されます。
- 新規レコード、レコード修正画面を開いたときのファイル
- 追加・更新時のイベント処理用ファイル
全角を半角に変換するメソッドは利用しているライブラリと一緒にイベント処理用のファイルの中にバンドルされています。
チュートリアルは以上です。お疲れさまでした。
参考: サンプルコード
注意点: Proxyだけには注意しましょう
Babelの制限事項として次のようなものがあります。
Due to the limitations of ES5, Proxies cannot be transpiled or polyfilled. See support in various JavaScript engines .( Babelの公式サイトから引用 )
ES5から使えるProxyだけは制限事項になっています。
このためInternet Explorer 11ではProxyを利用していると原因でエラーになってしまいます。
webpackを使うことでオープンソースのライブラリを使いやすくなりますが、ライブラリを利用する際は、念のためサポートブラウザーを一度確認してから使うようにしましょう。
おまけ:最近はこんな書き方ができるようになってます!
モダンなJavaScriptからお気に入り機能を紹介して終わりたいと思います。
const, let
- ブロックスコープ内で
const
を使って宣言された変数は、書き換えるとエラーになります。 - ブロックスコープ内で
let
を使って宣言された変数は、書き換えできます。
ブロックスコープを外れるとその変数は参照できなくなります。
テンプレート文字列
改行や変数の埋め込みをしやすい文法が使えるようになっています。
|
|
export, import
モジュール機能を実現するために導入された文法です。JavaScriptでモジュール機能が使えます。
グローバルにメソッド定義するのを避けつつモジュール機能を利用できます
kintoneカスタマイズの場合はwebpackを使ってビルドするようにしましょう。
export
|
|
import
|
|
分割代入
|
|
配列もしくはオブジェクトのプロパティの一部の値を簡単に取り出せるようになりました。
参考: 分割代入
オブジェクト初期化子
今まではオブジェクトのキー名を必ず渡す必要がありましたが、変数をそのままオブジェクトのリテラルの中にわたすと、そのままオブジェクトのプロパティとして適用してくれます。
|
|
参考: オブジェクト初期化子
アロー関数
関数を簡潔に書けるようになりました。
|
|
参考: アロー関数式
おわりに
お疲れさまでした。
webpack, Babel, Polyfillを活用してJavaScript開発の面倒なところを避けつつ、快適なJavaScriptライフをお過ごしください!
このチュートリアルでは毎回ビルドしていますが更新されたJavaScriptを検知して自動的に再ビルドしてくれるしくみもあります。
開発中はこちらを使うとJavaScript更新の手間が省けます。
こちらの記事も執筆予定です。次回作にご期待ください!
このTipsは、2019年2月版kintoneで動作を確認しています。