import/export
1 つのファイルに全部書かない
第1章では、商品データも整形もすべて 1 つのファイルに書いていました。小さいうちはそれで動きますが、API が育つと数百行になります。
直したい場所を探すのに時間がかかり、変えた場所が別の場所を壊していないかも分からなくなります。そこでファイルを役割ごとに分けます。
出す側と受け取る側
分けたファイルの中身は、そのままでは外から見えません。出したいものだけを明示的に出します。
JavaScript
// items.js
const items = [
{ id: 1, name: "レザースニーカー", price: 4800, sold: false },
{ id: 2, name: "古着のデニムジャケット", price: 6200, sold: false },
];
module.exports = { items };受け取る側は require で読み込みます。第1章で npm の部品を読み込んだのと同じ書き方です。
JavaScript
// app.js
const { items } = require("./items");
console.log(items.length);違いは ./ が付くことだけです。./ が付いていれば自分が書いたファイル、付いていなければ npm で借りた部品、という見分けになります。
出していないものは触れない
module.exports に入れなかったものは、外からは存在しないのと同じです。
JavaScript
// items.js
const SECRET_KEY = "内部でだけ使う値";
const items = [];
module.exports = { items }; // SECRET_KEY は出していないこれは不便ではなく、利点です。外に出したものだけが約束になるので、出していないものは好きなときに変えられます。ファイルの中で使う一時的な変数まで全部見えていたら、どれが変えてよいものか分からなくなります。
import と export という書き方
import / export という別の書き方もあり、こちらが新しい標準です。ブラウザ側の JavaScript で見たことがあるかもしれません。
このコースでは require と module.exports で統一します。仕組みは同じで、どちらも「出す側」と「受け取る側」を決める話です。
手を動かす
演習では、商品データのファイルが module.exports で何を出すのかを組み立てます。外に見せるものと隠すものを、自分で線引きしてください。
要件
- 返すオブジェクトは
itemsとcountの 2 つのキーだけを持つ itemsは受け取った配列をそのまま、countはその件数にする- 内部用の設定値は返すオブジェクトに含めない
入出力例
buildExports([{"id":1,"name":"レザースニーカー"},{"id":2,"name":"古着のデニムジャケット"}], {"dbPath":"./data"}) → {"count":2,"items":[{"id":1,"name":"レザースニーカー"},{"id":2,"name":"古着のデニムジャケット"}]}
buildExports([], {"dbPath":"./data"}) → {"count":0,"items":[]}ヒント
編集 ゆめさく編集部