npmとwebpackでjqueryをパッケージ管理する備忘録
目次
概要
今回はjqueryをnpmで管理しwebpackを使用してバンドルすることで、レガシーなフロントエンドをモダンに近づけたいと思います。
未だにjqueryとそのプラグインのソースコードをダウンロードし、プロジェクト内に配置しjqueryを使用しているプロジェクトは少なからず存在していると思います。
そんな環境からReactやVue.jsなどのモダンなフロントエンドへ移行していく作業の1ステップとしていつか役に立てばという思いで備忘録として残しておきます。
ソースコード
今回使用するファイルのディレクトリ構造とファイルは以下の通りです。
├─public
│ └─index.html
└─src
├─index.js
└─button
├─event.js
├─read.js
└─write.js
<!DOCTYPE html>
<html>
<body>
<p class="target">jquery</p>
<button class="button">convert</button>
</body>
</html>
<script src="./index.bundle.js"></script>
import $ from "jquery";
import { clickEvent } from "./button/event";
$(".button").on("click", clickEvent);
import { readTarget } from "./read";
import { writeText } from "./write";
export const clickEvent = () => {
const target = readTarget();
writeText(target);
};
import $ from "jquery";
export const readTarget = () => $(".target").get(0);
export const writeText = (element) => {
const text = element.textContent;
if (text !== "JQUERY") {
element.textContent = "JQUERY";
} else {
element.textContent = "jquery";
}
};
npmでjqueryを管理する
まずnpmでjqueryを管理します。
$ npm init
$ npm install jquery
これでpackage.jsonが作成されjqueryをnpmで管理出来ます。
今後package.jsonを元にjqueryやその他ライブラリを管理しましょう。
npm自体のインストール方法は割愛します。
webpackの導入
次にnpmで管理しているjqueryをimport $ from "jquery";
などで読み込むためにwebpackを導入します。
$ npm install webpack webpack-cli --save-dev
webpackは設定ファイルで設定を管理出来るため、設定ファイルを作成します。
const path = require("path");
module.exports = {
mode: "development",
entry: {
index: "./src/index.js",
},
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "public"),
},
resolve: {
extensions: [".js"],
},
};
この設定ファイルでは./src/index.js
を起点に使用されているライブラリやモジュールを1つのファイルにバンドルします。
今回はindex.jsとbuttonディレクトリ配下のjavascriptファイルが1つのファイルにバンドルされます。
また、バンドルしたファイルはoutput
によりファイル名と出力先のパスが設定されています。
この設定ファイルでは、ファイル名.bundle.js
という名前でpublicディレクトリ配下にファイルが作成されます。
HTMLファイルではこのバンドルされたindex.bundle.js
のファイルを読み込むことでnpm管理下のjqueryをimport $ from "jquery";
などで読み込んで使用することが出来ます。
webpackでファイルをバンドルしましょう。
$ npm run webpack
publicディレクトリ配下にindex.bundle.js
ファイルが作成されたと思います。
index.html
をブラウザで開くとjavascriptが動作していることが分かると思います。
webpack-dev-serverの導入
webpack単体ではファイルを変更するたびにバンドルする必要がありました。
なのでファイルの変更を検知して自動でバンドル出来るようにwebpack-dev-serverを導入します。
$ npm install webpack-dev-server --save-dev
設定ファイルも書き換えましょう。
const path = require("path");
module.exports = {
mode: "development",
entry: {
index: "./src/index.js",
},
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "public"),
},
resolve: {
extensions: [".js"],
},
devServer: {
open: true,
static: path.join(__dirname, "public"),
},
};
以下のコマンドで起動しましょう。
$ npm run webpack serve
これでjavascriptなどのファイルを変更すると自動でその変更が反映されるようになりました。
環境ごとに設定を変える
これまで1つの設定でファイルをバンドルしてきましたが、開発環境や本番環境では設定を変えたい場面が出てくると思います。
そのため、開発環境用と本番環境用の設定ファイルを用意し環境によって設定を切り替えるようにします。
ファイル名はwebpack.config.[環境名].js
になります。
これまでの設定ファイルは開発環境用の設定にしましょう。
const path = require("path");
module.exports = {
mode: "development",
entry: {
index: "./src/index.js",
},
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "public"),
},
resolve: {
extensions: [".js"],
},
devServer: {
open: true,
static: path.join(__dirname, "public"),
},
};
本番環境用の設定ファイルではconsole.log
やコメントを削除する設定にしています。
const path = require("path");
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
mode: "production",
entry: {
index: "./src/index.js",
},
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "public"),
},
resolve: {
extensions: [".js"],
},
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true,
},
format: {
comments: false,
},
},
}),
],
},
};
npmによるコマンドの簡略化
npmでは開発時のサーバーの起動と本番環境でのビルドのコマンドをpackage.jsonで記述することでコマンドを簡略化することが出来ます。
{
"name": "jquery",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"dev": "webpack serve --config webpack.config.dev.js",
"build": "webpack --config webpack.config.production.js"
},
"dependencies": {
"jquery": "^3.7.1"
},
"devDependencies": {
"webpack": "^5.89.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"
}
}
scripts
内に開発時のサーバー起動用のdev
コマンドと本番環境でのビルド用のbuild
コマンドを定義しました。
今後は以下のように実行可能です。
$ npm run dev // 開発サーバーの起動
$ npm run build // 本番環境用のビルド
まとめ
以上がjqueryをnpmで管理するwebpackでバンドルする備忘録でした。
javascriptのファイルについては『迷わない!困らない!レガシーフロントエンド安全改善ガイド』を一部参考にしています。
Discussion