เครื่องมือจัดกลุ่มโมดูล JavaScript ทำได้หลายอย่าง แต่ฟีเจอร์ที่มีประโยชน์มากที่สุดอย่างหนึ่งคือความสามารถในการเพิ่มและใช้ไลบรารีภายนอกในโค้ดเบส เครื่องมือจัดแพ็กเกจโมดูลจะอ่านเส้นทางการนำเข้าในโค้ดและรวม (จัดแพ็กเกจ) โค้ดเฉพาะแอปพลิเคชันกับโค้ดไลบรารีที่นำเข้า
ตั้งแต่เวอร์ชัน 9 ขึ้นไป Firebase JavaScript Modular API ได้รับการเพิ่มประสิทธิภาพให้ทำงานร่วมกับ ฟีเจอร์การเพิ่มประสิทธิภาพของเครื่องมือจัดแพ็กเกจโมดูลเพื่อลดปริมาณโค้ด Firebase ที่รวมอยู่ในการบิลด์ขั้นสุดท้าย
import { initializeApp } from 'firebase/app';
import { getAuth, onAuthStateChanged, getRedirectResult } from 'firebase/auth';
const firebaseApp = initializeApp({ /* config */ });
const auth = getAuth(firebaseApp);
onAuthStateChanged(auth, user => { /* check status */ });
/**
* getRedirectResult is unused and should not be included in the code base.
* In addition, there are many other functions within firebase/auth that are
* not imported and therefore should not be included as well.
*/
กระบวนการกำจัดโค้ดที่ไม่ได้ใช้ออกจากไลบรารีนี้เรียกว่า Tree Shaking การนำโค้ดนี้ออกด้วยตนเองจะใช้เวลานานมากและเกิดข้อผิดพลาดได้ง่าย แต่เครื่องมือจัดกลุ่มโมดูลจะช่วยนำโค้ดนี้ออกโดยอัตโนมัติได้
ระบบนิเวศ JavaScript มีเครื่องมือจัดแพ็กเกจโมดูลคุณภาพสูงมากมาย คำแนะนำนี้มุ่งเน้นที่การใช้ Firebase กับ webpack, Rollup และ esbuild
เริ่มต้นใช้งาน
คู่มือนี้กำหนดให้คุณต้องติดตั้ง npm ในสภาพแวดล้อมการพัฒนา npm ใช้เพื่อติดตั้งและจัดการทรัพยากร Dependency (ไลบรารี) หากต้องการติดตั้ง npm ให้ติดตั้ง Node.js ซึ่งจะรวม npm โดยอัตโนมัติ
นักพัฒนาแอปส่วนใหญ่จะตั้งค่าได้อย่างถูกต้องเมื่อติดตั้ง Node.js อย่างไรก็ตาม มีปัญหาที่พบบ่อยซึ่งนักพัฒนาแอปจำนวนมากพบเมื่อตั้งค่า สภาพแวดล้อม หากพบข้อผิดพลาด โปรดตรวจสอบว่าสภาพแวดล้อมของคุณมี npm CLI และคุณได้ตั้งค่าสิทธิ์ที่เหมาะสมแล้ว เพื่อให้ไม่ต้องติดตั้งแพ็กเกจในฐานะผู้ดูแลระบบด้วยคำสั่ง sudo
package.json และการติดตั้ง Firebase
เมื่อติดตั้ง npm แล้ว คุณจะต้องสร้างไฟล์ package.json
ที่
รูทของโปรเจ็กต์ในเครื่อง สร้างไฟล์นี้ด้วยคำสั่ง npm ต่อไปนี้
npm init
ซึ่งจะนำคุณไปยังวิซาร์ดเพื่อระบุข้อมูลที่จำเป็น เมื่อสร้าง ไฟล์แล้ว ไฟล์จะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้
{
"name": "your-package-name",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
}
}
ไฟล์นี้มีหน้าที่รับผิดชอบหลายอย่าง นี่เป็นไฟล์สำคัญที่คุณควรทำความคุ้นเคยหากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการรวมโมดูลและการสร้างโค้ด JavaScript โดยทั่วไป ส่วนสำคัญของคำแนะนำนี้คือออบเจ็กต์ "dependencies"
ออบเจ็กต์นี้จะเก็บคู่คีย์-ค่าของไลบรารี
ที่คุณติดตั้งและเวอร์ชันที่ใช้
การเพิ่มการอ้างอิงทำได้ผ่านคำสั่ง npm install
หรือ npm i
npm i firebase
เมื่อเรียกใช้ npm i firebase
กระบวนการติดตั้งจะอัปเดต
package.json
เพื่อแสดง Firebase เป็นทรัพยากร Dependency
"dependencies": {
"firebase": "^9.0.0"
},
คีย์คือชื่อของไลบรารี และค่าคือเวอร์ชันที่จะใช้ ค่าเวอร์ชันมีความยืดหยุ่นและยอมรับค่าได้หลากหลาย ซึ่งเรียกว่า การกำหนดเวอร์ชันเชิงความหมายหรือ SemVer ดูข้อมูลเพิ่มเติมเกี่ยวกับ Semver ได้ที่คำแนะนำของ npm เกี่ยวกับการกำหนดเวอร์ชันเชิงความหมาย
โฟลเดอร์แหล่งที่มาเทียบกับโฟลเดอร์บิลด์
โค้ดที่คุณเขียนจะได้รับการอ่านและประมวลผลโดยเครื่องมือจัดกลุ่มโมดูล จากนั้นจะแสดงผลเป็น ไฟล์ใหม่หรือชุดไฟล์ คุณควรแยกไฟล์ 2 ประเภทนี้ออกจากกัน โค้ดที่เครื่องมือจัดกลุ่มโมดูลอ่านและประมวลผลเรียกว่าโค้ด "แหล่งที่มา" ไฟล์ที่เอาต์พุตเรียกว่าโค้ดที่สร้างขึ้นหรือโค้ด "dist" (การเผยแพร่)
การตั้งค่าที่พบบ่อยในฐานโค้ดคือการจัดเก็บซอร์สโค้ดในโฟลเดอร์ชื่อ src
และโค้ดที่สร้างในโฟลเดอร์ชื่อ dist
- src
|_ index.js
|_ animations.js
|_ datalist.js
- dist
|_ bundle.js
ในโครงสร้างไฟล์ตัวอย่างด้านบน ให้พิจารณาว่า index.js
นำเข้าทั้ง
animations.js
และ datalist.js
เมื่อตัวจัดกลุ่มโมดูลประมวลผลซอร์สโค้ด ระบบจะสร้างไฟล์ bundle.js
ในโฟลเดอร์ dist
bundle.js
คือการรวมไฟล์ในโฟลเดอร์ src
และไลบรารีที่นำเข้า
ด้วย
หากคุณใช้ระบบควบคุมแหล่งที่มา เช่น Git โดยทั่วไปแล้วจะมีการละเว้นโฟลเดอร์ dist
เมื่อจัดเก็บโค้ดนี้ในที่เก็บข้อมูลหลัก
จุดแรกเข้า
เครื่องมือจัดกลุ่มโมดูลทั้งหมดมีแนวคิดของจุดแรกเข้า คุณอาจนึกถึงแอปพลิเคชันเป็นโครงสร้างแบบต้นไม้ของไฟล์ ไฟล์หนึ่งจะนำเข้าโค้ดจากอีกไฟล์หนึ่ง และอื่นๆ ซึ่งหมายความว่าจะมีไฟล์หนึ่งเป็นรูทของแผนผัง ไฟล์นี้เรียกว่าจุดแรกเข้า
มาดูตัวอย่างโครงสร้างไฟล์ก่อนหน้านี้อีกครั้ง
- src
|_ index.js
|_ animations.js
|_ datalist.js
- dist
|_ bundle.js
// src/index.js
import { animate } from './animations';
import { createList } from './datalist';
// This is not real code, but for example purposes only
const theList = createList('users/123/tasks');
theList.addEventListener('loaded', event => {
animate(theList);
});
ระบบจะถือว่าไฟล์ src/index.js
เป็นจุดแรกเข้าเนื่องจากเป็นจุดเริ่มต้นของการนำเข้าโค้ดทั้งหมดที่จำเป็นสำหรับแอปพลิเคชัน
ไฟล์จุดแรกเข้านี้ใช้โดยเครื่องมือจัดกลุ่มโมดูลเพื่อเริ่มกระบวนการจัดกลุ่ม
การใช้ Firebase กับ webpack
คุณไม่จำเป็นต้องกำหนดค่าแอป Firebase และ webpack ที่เฉพาะเจาะจง ส่วนนี้ครอบคลุมการกำหนดค่า webpack ทั่วไป
ขั้นตอนแรกคือการติดตั้ง webpack จาก npm เป็นการขึ้นต่อกันในการพัฒนา
npm i webpack webpack-cli -D
สร้างไฟล์ที่รูทของโปรเจ็กต์ในเครื่องชื่อ webpack.config.js
แล้วเพิ่มโค้ดต่อไปนี้
const path = require('path');
module.exports = {
// The entry point file described above
entry: './src/index.js',
// The location of the build folder described above
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
},
// Optional and for development only. This provides the ability to
// map the built code back to the original source format when debugging.
devtool: 'eval-source-map',
};
จากนั้นตรวจสอบว่าคุณได้ติดตั้ง Firebase เป็นทรัพยากร Dependency แล้ว
npm i firebase
จากนั้นเริ่มต้น Firebase ในโค้ดเบส โค้ดต่อไปนี้นำเข้าและ เริ่มต้น Firebase ในไฟล์จุดแรกเข้า และใช้ Firestore Lite เพื่อโหลดเอกสาร "city"
// src/index.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';
const firebaseApp = initializeApp({ /* config */ });
const db = getFirestore(firebaseApp);
async function loadCity(name) {
const cityDoc = doc(db, `cities/${name}`);
const snapshot = await getDoc(cityDoc);
return {
id: snapshot.id,
...snapshot.data(),
};
}
ขั้นตอนถัดไปคือเพิ่มสคริปต์ npm
เพื่อเรียกใช้การสร้าง webpack เปิดไฟล์ package.json
แล้วเพิ่มคู่คีย์-ค่าต่อไปนี้ลงในออบเจ็กต์ "scripts"
"scripts": {
"build": "webpack --mode=development"
},
หากต้องการเรียกใช้ webpack และสร้างโฟลเดอร์บิลด์ ให้เรียกใช้คำสั่งต่อไปนี้
npm run build
สุดท้าย ให้ตรวจสอบdist
โฟลเดอร์บิลด์ โดยควรมีไฟล์ชื่อ
bundle.js
ซึ่งมีโค้ดแอปพลิเคชันและโค้ดการอ้างอิงที่รวมไว้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพการสร้าง webpack สำหรับการใช้งานจริงได้ใน เอกสารประกอบอย่างเป็นทางการเกี่ยวกับการตั้งค่า "โหมด"
การใช้ Firebase กับ Rollup
ไม่ต้องมีการกำหนดค่าที่เฉพาะเจาะจงสำหรับแอป Firebase และการสรุป ส่วนนี้จะครอบคลุมการกำหนดค่าการสรุปทั่วไป
ขั้นตอนแรกคือการติดตั้ง Rollup และปลั๊กอินที่ใช้ในการแมปการนำเข้าไปยัง การขึ้นต่อกันที่ติดตั้งด้วย npm
npm i rollup @rollup/plugin-node-resolve -D
สร้างไฟล์ที่รูทของโปรเจ็กต์ในเครื่องชื่อ rollup.config.js
แล้วเพิ่มโค้ดต่อไปนี้
import { nodeResolve } from '@rollup/plugin-node-resolve';
export default {
// the entry point file described above
input: 'src/index.js',
// the output for the build folder described above
output: {
file: 'dist/bundle.js',
// Optional and for development only. This provides the ability to
// map the built code back to the original source format when debugging.
sourcemap: 'inline',
// Configure Rollup to convert your module code to a scoped function
// that "immediate invokes". See the Rollup documentation for more
// information: https://rollupjs.org/guide/en/#outputformat
format: 'iife'
},
// Add the plugin to map import paths to dependencies
// installed with npm
plugins: [nodeResolve()]
};
จากนั้นเริ่มต้น Firebase ในโค้ดเบส โค้ดต่อไปนี้นำเข้าและ เริ่มต้น Firebase ในไฟล์จุดแรกเข้า และใช้ Firestore Lite เพื่อโหลดเอกสาร "city"
// src/index.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';
const firebaseApp = initializeApp({ /* config */ });
const db = getFirestore(firebaseApp);
async function loadCity(name) {
const cityDoc = doc(db, `cities/${name}`);
const snapshot = await getDoc(cityDoc);
return {
id: snapshot.id,
...snapshot.data(),
};
}
ขั้นตอนถัดไปคือเพิ่มสคริปต์ npm
เพื่อเรียกใช้บิลด์ Rollup เปิดไฟล์ package.json
แล้วเพิ่มคู่คีย์-ค่าต่อไปนี้ลงในออบเจ็กต์ "scripts"
"scripts": {
"build": "rollup -c rollup.config.js"
},
หากต้องการเรียกใช้ Rollup และสร้างโฟลเดอร์บิลด์ ให้เรียกใช้คำสั่งต่อไปนี้
npm run build
สุดท้าย ให้ตรวจสอบdist
โฟลเดอร์บิลด์ โดยควรมีไฟล์ชื่อ
bundle.js
ซึ่งมีโค้ดแอปพลิเคชันและโค้ดการอ้างอิงที่รวมไว้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพบิลด์ Rollup สำหรับการใช้งานจริงได้ในเอกสารประกอบอย่างเป็นทางการเกี่ยวกับปลั๊กอินสำหรับการบิลด์ที่ใช้งานจริง
การใช้ Firebase กับ esbuild
ไม่จำเป็นต้องมีการกำหนดค่าที่เฉพาะเจาะจงสำหรับแอป Firebase และ esbuild ส่วนนี้ จะครอบคลุมการกำหนดค่า esbuild ทั่วไป
ขั้นตอนแรกคือการติดตั้ง esbuild เป็นทรัพยากร Dependency ในการพัฒนา
npm i esbuild -D
สร้างไฟล์ที่รูทของโปรเจ็กต์ในเครื่องชื่อ esbuild.config.js
แล้วเพิ่มโค้ดต่อไปนี้
require('esbuild').build({
// the entry point file described above
entryPoints: ['src/index.js'],
// the build folder location described above
outfile: 'dist/bundle.js',
bundle: true,
// Replace with the browser versions you need to target
target: ['chrome60', 'firefox60', 'safari11', 'edge20'],
// Optional and for development only. This provides the ability to
// map the built code back to the original source format when debugging.
sourcemap: 'inline',
}).catch(() => process.exit(1))
จากนั้นเริ่มต้น Firebase ในโค้ดเบส โค้ดต่อไปนี้นำเข้าและ เริ่มต้น Firebase ในไฟล์จุดแรกเข้า และใช้ Firestore Lite เพื่อโหลดเอกสาร "city"
// src/index.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';
const firebaseApp = initializeApp({ /* config */ });
const db = getFirestore(firebaseApp);
async function loadCity(name) {
const cityDoc = doc(db, `cities/${name}`);
const snapshot = await getDoc(cityDoc);
return {
id: snapshot.id,
...snapshot.data(),
};
}
ขั้นตอนถัดไปคือเพิ่มสคริปต์ npm
เพื่อเรียกใช้ esbuild เปิดไฟล์ package.json
แล้วเพิ่มคู่คีย์-ค่าต่อไปนี้ลงในออบเจ็กต์ "scripts"
"scripts": {
"build": "node ./esbuild.config.js"
},
สุดท้าย ให้ตรวจสอบdist
โฟลเดอร์บิลด์ โดยควรมีไฟล์ชื่อ
bundle.js
ซึ่งมีโค้ดแอปพลิเคชันและโค้ดการอ้างอิงที่รวมไว้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพ esbuild สำหรับการใช้งานจริงได้ในเอกสารประกอบอย่างเป็นทางการเกี่ยวกับการลดขนาดและการเพิ่มประสิทธิภาพอื่นๆ