Sử dụng bộ đóng gói mô-đun với Firebase

Trình đóng gói mô-đun JavaScript có thể thực hiện nhiều việc nhưng một trong những tính năng hữu ích nhất của chúng là khả năng thêm và sử dụng các thư viện bên ngoài trong cơ sở mã của bạn. Trình đóng gói mô-đun đọc đường dẫn nhập trong mã của bạn và kết hợp (gói) mã dành riêng cho ứng dụng của bạn với mã thư viện đã nhập của bạn.

Từ phiên bản 9 trở lên, API mô-đun Firebase JavaScript được tối ưu hóa để hoạt động với các tính năng tối ưu hóa của bộ đóng gói mô-đun nhằm giảm số lượng mã Firebase có trong bản dựng cuối cùng của bạn.

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.
 */

Quá trình loại bỏ mã không sử dụng khỏi thư viện này được gọi là rung cây. Sẽ cực kỳ tốn thời gian và dễ xảy ra lỗi khi xóa mã này theo cách thủ công, nhưng các trình đóng gói mô-đun có thể tự động hóa việc xóa này.

Có rất nhiều gói mô-đun chất lượng cao trong hệ sinh thái JavaScript. Hướng dẫn này tập trung vào việc đề cập đến cách sử dụng Firebase với webpack , Rollupesbuild .

Bắt đầu

Hướng dẫn này yêu cầu bạn phải cài đặt npm trong môi trường phát triển của mình. npm được sử dụng để cài đặt và quản lý các phụ thuộc (thư viện). Để cài đặt npm, hãy cài đặt Node.js , bao gồm npm tự động.

Hầu hết các nhà phát triển đều được thiết lập đúng cách sau khi họ cài đặt Node.js. Tuy nhiên, có những vấn đề phổ biến mà nhiều nhà phát triển gặp phải khi thiết lập môi trường của họ. Nếu bạn gặp bất kỳ lỗi nào, hãy đảm bảo môi trường của bạn có npm CLI và bạn đã thiết lập các quyền thích hợp để không phải cài đặt các gói với tư cách quản trị viên bằng lệnh sudo .

pack.json và cài đặt Firebase

Khi đã cài đặt npm, bạn sẽ cần tạo tệp package.json ở thư mục gốc của dự án cục bộ của mình. Tạo tệp này bằng lệnh npm sau:

npm init

Điều này sẽ đưa bạn qua một trình hướng dẫn để cung cấp thông tin cần thiết. Khi tệp được tạo, nó sẽ trông giống như sau:

{
  "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": {

  }
}

Tập tin này chịu trách nhiệm cho nhiều thứ khác nhau. Đây là một tệp quan trọng mà bạn cần làm quen nếu muốn tìm hiểu thêm về cách đóng gói mô-đun và xây dựng mã JavaScript nói chung. Phần quan trọng của hướng dẫn này là đối tượng "dependencies" . Đối tượng này sẽ chứa một cặp giá trị khóa của thư viện bạn đã cài đặt và phiên bản nó đang sử dụng.

Việc thêm các phụ thuộc được thực hiện thông qua lệnh npm install hoặc npm i .

npm i firebase

Khi bạn chạy npm i firebase , quá trình cài đặt sẽ cập nhật package.json để liệt kê Firebase làm phần phụ thuộc:

  "dependencies": {
    "firebase": "^9.0.0"
  },

Khóa là tên của thư viện và giá trị là phiên bản sẽ sử dụng. Giá trị phiên bản rất linh hoạt và có thể chấp nhận một loạt các giá trị. Điều này được gọi là phiên bản ngữ nghĩa hoặc ngữ nghĩa. Để tìm hiểu thêm về semver, hãy xem hướng dẫn của npm về phiên bản ngữ nghĩa .

Thư mục nguồn và bản dựng

Mã bạn viết được đọc và xử lý bởi bộ đóng gói mô-đun, sau đó xuất ra dưới dạng tệp hoặc tập hợp tệp mới. Điều quan trọng là phải tách biệt hai loại tệp này. Mã mà bộ đóng gói mô-đun đọc và xử lý được gọi là mã "nguồn". Các tệp mà chúng xuất ra được gọi là mã được xây dựng hoặc mã "dist" (phân phối).

Cách thiết lập phổ biến trong cơ sở mã là lưu trữ mã nguồn trong thư mục có tên src và mã được xây dựng trong thư mục có tên dist .

- src
 |_ index.js
 |_ animations.js
 |_ datalist.js


- dist
 |_ bundle.js

Trong cấu trúc tệp ví dụ ở trên, hãy xem xét rằng index.js nhập cả animations.jsdatalist.js . Khi trình đóng gói mô-đun xử lý mã nguồn, nó sẽ tạo ra tệp bundle.js trong thư mục dist . bundle.js là sự kết hợp của các tệp trong thư mục src và bất kỳ thư viện nào được nhập.

Nếu bạn đang sử dụng các hệ thống kiểm soát nguồn như Git, bạn thường bỏ qua thư mục dist khi lưu trữ mã này trong kho lưu trữ chính.

Các điểm nhập cảnh

Tất cả các bộ đóng gói mô-đun đều có khái niệm về điểm vào. Bạn có thể coi ứng dụng của mình như một cây tệp. Một tệp nhập mã từ một tệp khác, v.v. Điều này có nghĩa là một tập tin sẽ là gốc của cây. Tập tin này được gọi là điểm vào.

Hãy xem lại ví dụ về cấu trúc tập tin trước đó.

- 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);
});

Tệp src/index.js được coi là điểm vào vì nó bắt đầu nhập tất cả mã cần thiết cho ứng dụng. Tệp điểm nhập này được các trình đóng gói mô-đun sử dụng để bắt đầu quá trình đóng gói.

Sử dụng Firebase với gói web

Không có cấu hình cụ thể cần thiết cho ứng dụng và gói web Firebase. Phần này bao gồm cấu hình webpack chung .

Bước đầu tiên là cài đặt webpack từ npm như một phần phụ thuộc phát triển.

npm i webpack webpack-cli -D

Tạo một tệp ở thư mục gốc của dự án cục bộ của bạn có tên webpack.config.js và thêm mã sau đây.

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',
};

Sau đó, hãy đảm bảo bạn đã cài đặt Firebase làm phần phụ thuộc.

npm i firebase

Sau đó khởi tạo Firebase trong cơ sở mã của bạn. Đoạn mã sau nhập và khởi tạo Firebase trong tệp điểm nhập và sử dụng Firestore Lite để tải tài liệu "thành phố".

// 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(),
  };
}

Bước tiếp theo là thêm tập lệnh npm để chạy bản dựng webpack. Mở tệp package.json và thêm cặp giá trị khóa sau vào đối tượng "scripts" .

  "scripts": {
    "build": "webpack --mode=development"
  },

Để chạy webpack và tạo thư mục build, hãy chạy lệnh sau.

npm run build

Cuối cùng, kiểm tra thư mục dist build. Nó phải chứa một tệp có tên bundle.js chứa ứng dụng đi kèm và mã phụ thuộc của bạn.

Để biết thêm thông tin về cách tối ưu hóa bản dựng webpack cho sản xuất, hãy xem tài liệu chính thức của họ về cài đặt cấu hình "chế độ" .

Sử dụng Firebase với Rollup

Không có cấu hình cụ thể cần thiết cho ứng dụng Firebase và Rollup. Phần này bao gồm cấu hình tổng hợp chung.

Bước đầu tiên là cài đặt Rollup và một plugin được sử dụng để ánh xạ quá trình nhập vào các phần phụ thuộc được cài đặt bằng npm.

npm i rollup @rollup/plugin-node-resolve -D

Tạo một tệp ở thư mục gốc của dự án cục bộ của bạn có tên rollup.config.js và thêm mã sau đây.

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()]
};

Sau đó khởi tạo Firebase trong cơ sở mã của bạn. Đoạn mã sau nhập và khởi tạo Firebase trong tệp điểm nhập và sử dụng Firestore Lite để tải tài liệu "thành phố".

// 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(),
  };
}

Bước tiếp theo là thêm tập lệnh npm để chạy bản dựng tổng hợp. Mở tệp package.json và thêm cặp giá trị khóa sau vào đối tượng "scripts" .

  "scripts": {
    "build": "rollup -c rollup.config.js"
  },

Để chạy rollup và tạo thư mục bản dựng, hãy chạy lệnh sau.

npm run build

Cuối cùng, kiểm tra thư mục dist build. Nó phải chứa một tệp có tên bundle.js chứa ứng dụng đi kèm và mã phụ thuộc của bạn.

Để biết thêm thông tin về cách tối ưu hóa bản dựng tổng hợp cho sản xuất, hãy xem tài liệu chính thức của họ về plugin dành cho bản dựng sản xuất .

Sử dụng Firebase với esbuild

Không có cấu hình cụ thể cần thiết cho ứng dụng Firebase và esbuild. Phần này bao gồm cấu hình esbuild chung.

Bước đầu tiên là cài đặt esbuild làm phần phụ thuộc phát triển.

npm i esbuild -D

Tạo một tệp ở thư mục gốc của dự án cục bộ của bạn có tên esbuild.config.js và thêm mã sau đây.

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))

Sau đó khởi tạo Firebase trong cơ sở mã của bạn. Đoạn mã sau nhập và khởi tạo Firebase trong tệp điểm nhập và sử dụng Firestore Lite để tải tài liệu "thành phố".

// 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(),
  };
}

Bước tiếp theo là thêm tập lệnh npm để chạy esbuild. Mở tệp package.json và thêm cặp giá trị khóa sau vào đối tượng "scripts" .

  "scripts": {
    "build": "node ./esbuild.config.js"
  },

Cuối cùng, kiểm tra thư mục dist build. Nó phải chứa một tệp có tên bundle.js chứa ứng dụng đi kèm và mã phụ thuộc của bạn.

Để biết thêm thông tin về cách tối ưu hóa esbuild cho sản xuất, hãy xem tài liệu chính thức của họ về việc thu nhỏ và tối ưu hóa khác .