- vừa được xem lúc

Làm chủ JavaScript: Khám phá sâu về Browser APIs và các mẫu thiết kế nâng cao

0 0 5

Người đăng: Thái Thịnh

Theo Viblo Asia

JavaScript là nền tảng của phát triển web hiện đại. Mặc dù nhiều lập trình viên bắt đầu với các khái niệm cơ bản như thao tác DOM và xử lý sự kiện, nhưng để thật sự làm chủ JavaScript, bạn cần đi sâu hơn — khám phá các API trình duyệt mạnh mẽ và các mẫu thiết kế nâng cao giúp xây dựng ứng dụng hiệu suất cao, có khả năng mở rộng và dễ bảo trì.

Hướng dẫn này sẽ đưa bạn qua các API trình duyệt thiết yếu và các kỹ thuật JavaScript nâng cao, kèm theo các ví dụ thực tế để giúp bạn nâng tầm kỹ năng lập trình của mình.

Tại sao cần kiến thức JavaScript chuyên sâu?

JavaScript đã vượt xa khỏi vai trò là một ngôn ngữ kịch bản đơn giản. Hiện nay, nó được sử dụng để:

  • Ứng dụng web tương tác (React, Vue, Angular)
  • Logic phía server (Node.js, Deno)
  • Ứng dụng di động (React Native, Ionic)
  • Ứng dụng desktop (Electron, Tauri)

Để trở thành lập trình viên giỏi, bạn cần:

  • Làm chủ Browser APIs để tận dụng các khả năng gốc như định vị, Web Workers và lưu trữ ngoại tuyến.
  • Áp dụng các mẫu thiết kế nâng cao để viết mã sạch hơn, hiệu quả hơn và dễ mở rộng.
  • Tối ưu hiệu suất với các kỹ thuật như ghi nhớ (memoization), giảm tần suất gọi hàm (throttling), và kết xuất DOM ảo.

Các API trình duyệt thiết yếu mà mọi lập trình viên nên biết

1. DOM và sự kiện

// Selecting elements
const button = document.getElementById('submit-btn');
const allDivs = document.querySelectorAll('div'); // Modifying content
button.textContent = 'Click Me';
button.classList.add('active'); // Event handling with delegation
document.addEventListener('click', (event) => { if (event.target.matches('.delete-btn')) { event.target.parentElement.remove(); }
});

2. Fetch API và Async/Await

// Using Fetch with Promises
fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); // Cleaner approach with Async/Await
async function loadData() { try { const response = await fetch('https://api.example.com/data'); const data = await response.json(); return data; } catch (error) { console.error('Failed to fetch:', error); }
}

3. Web Storage (localStorage & sessionStorage)

// Save data
localStorage.setItem('user', JSON.stringify({ name: 'John', age: 30 })); // Retrieve data
const user = JSON.parse(localStorage.getItem('user'));
console.log(user.name); // "John" // Session storage (clears when tab closes)
sessionStorage.setItem('token', 'abc123');

4. Web Workers – Xử lý nền

// main.js
const worker = new Worker('worker.js');
worker.postMessage({ data: [1, 2, 3, 4, 5] });
worker.onmessage = (event) => { console.log('Result from worker:', event.data);
}; // worker.js
onmessage = (event) => { const result = event.data.data.map(num => num * 2); postMessage(result);
};

5. Intersection Observer – Tải ảnh lười (lazy loading)

const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.src = entry.target.dataset.src; // Load image observer.unobserve(entry.target); } });
}); document.querySelectorAll('img.lazy').forEach(img => { observer.observe(img);
});

Các mẫu thiết kế nâng cao trong JavaScript

1. Module & Revealing Module Pattern

// Module Pattern
const CounterModule = (() => { let count = 0; const increment = () => count++; const getCount = () => count; return { increment, getCount };
})(); CounterModule.increment();
console.log(CounterModule.getCount()); // 1

2. Singleton Pattern

const Database = (() => { let instance; function createInstance() { return { query: (sql) => console.log(`Executing: ${sql}`) }; } return { getInstance: () => { if (!instance) instance = createInstance(); return instance; } };
})(); const db1 = Database.getInstance();
const db2 = Database.getInstance();
console.log(db1 === db2); // true (same instance)

3. Observer / Pub-Sub Pattern

// Simple Pub/Sub Implementation
const EventBus = { subscribers: {}, subscribe(event, callback) { if (!this.subscribers[event]) this.subscribers[event] = []; this.subscribers[event].push(callback); }, publish(event, data) { if (this.subscribers[event]) { this.subscribers[event].forEach(cb => cb(data)); } }
}; // Usage
EventBus.subscribe('userLoggedIn', (user) => { console.log(`${user.name} just logged in!`);
}); EventBus.publish('userLoggedIn', { name: 'Alice' });

4. Memoization – Tối ưu hiệu suất

function memoize(fn) { const cache = {}; return (...args) => { const key = JSON.stringify(args); if (cache[key]) return cache[key]; const result = fn(...args); cache[key] = result; return result; };
} // Example: Fibonacci with memoization
const fib = memoize((n) => { if (n <= 1) return n; return fib(n - 1) + fib(n - 2);
}); console.log(fib(10)); // 55 (cached for future calls)

5. Throttle & Debounce

// Throttle: Execute at most once every 200ms
function throttle(fn, delay) { let lastCall = 0; return (...args) => { const now = Date.now(); if (now - lastCall < delay) return; lastCall = now; return fn(...args); };
} // Debounce: Execute after 200ms of inactivity
function debounce(fn, delay) { let timeout; return (...args) => { clearTimeout(timeout); timeout = setTimeout(() => fn(...args), delay); };
} // Usage (e.g., resize events)
window.addEventListener('resize', throttle(() => { console.log('Window resized');
}, 200));

Tiếp tục học hỏi và xây dựng

Việc làm chủ JavaScript là một hành trình dài. Càng khám phá các Browser API và mẫu thiết kế nâng cao, bạn càng có thể viết những giải pháp hiệu quả, sáng tạo và đẳng cấp hơn.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 544

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 458

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 168

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 156

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 119

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 262