Files
flys_blog/docs/notes/js.md
T
2025-06-13 16:30:38 +08:00

1107 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 1. JavaScript
## 1.1 基础语法
### 1.1.1 变量声明
JavaScript 中可以使用 `var``let``const` 来声明变量。示例如下:
```javascript
// 使用 var 声明变量
var oldVariable = 'This is a var variable';
// 使用 let 声明变量
let newVariable = 'This is a let variable';
// 使用 const 声明常量
const constantValue = 'This is a constant';
```
### 1.1.2 数据类型
JavaScript 有七种基本数据类型:`undefined``null``boolean``number``string``symbol``bigint`,以及一种引用数据类型 `object`。示例如下:
```javascript
// undefined
let undef;
console.log(undef); // undefined
// null
let empty = null;
console.log(empty); // null
// boolean
let isTrue = true;
let isFalse = false;
// number
let integer = 10;
let float = 3.14;
// string
let message = 'Hello, World!';
// symbol
let sym = Symbol('unique');
// bigint
let bigNumber = 1234567890123456789012345678901234567890n;
// object
let person = { name: 'John', age: 30 };
```
### 1.1.3 运算符
#### 算术运算符
```javascript
let a = 10;
let b = 5;
console.log(a + b); // 加法
console.log(a - b); // 减法
console.log(a * b); // 乘法
console.log(a / b); // 除法
console.log(a % b); // 取余
console.log(a ** b); // 幂运算
```
#### 比较运算符
```javascript
let x = 10;
let y = 20;
console.log(x == y); // 相等
console.log(x === y); // 严格相等
console.log(x != y); // 不相等
console.log(x !== y); // 严格不相等
console.log(x < y); // 小于
console.log(x > y); // 大于
console.log(x <= y); // 小于等于
console.log(x >= y); // 大于等于
```
#### 逻辑运算符
```javascript
let p = true;
let q = false;
console.log(p && q); // 逻辑与
console.log(p || q); // 逻辑或
console.log(!p); // 逻辑非
```
## 1.2 函数
### 1.2.1 函数声明
```javascript
function add(a, b) {
return a + b;
}
let result = add(3, 5);
console.log(result); // 8
```
### 1.2.2 箭头函数
```javascript
const multiply = (a, b) => a * b;
let product = multiply(4, 6);
console.log(product); // 24
```
### 1.2.3 函数作用域
```javascript
function outerFunction() {
let outerVar = 'I am outside';
function innerFunction() {
let innerVar = 'I am inside';
console.log(outerVar); // 可以访问外部变量
}
innerFunction();
// console.log(innerVar); // 报错,无法访问内部变量
}
outerFunction();
```
## 1.3 异步编程
### 1.3.1 Promise
Promise 是异步编程的一种解决方案,用于表示一个异步操作的最终完成(或失败)及其结果值。它有三种状态:`pending`(进行中)、`fulfilled`(已成功)和 `rejected`(已失败)。状态一旦改变,就不会再变。
```javascript
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) {
resolve('Data fetched successfully');
} else {
reject(new Error('Failed to fetch data'));
}
}, 2000);
});
}
fetchData()
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
```
使用场景:处理异步操作,如网络请求、文件读取等,避免回调地狱。
### 1.3.2 Async/Await
`async/await` 是基于 Promise 的语法糖,它让异步代码看起来更像同步代码,提高了代码的可读性。`async` 函数总是返回一个 Promise`await` 只能在 `async` 函数内部使用,用于等待一个 Promise 完成并返回其结果。
```javascript
async function getData() {
try {
let data = await fetchData();
console.log(data);
} catch (error) {
console.error(error);
}
}
getData();
```
使用场景:在需要按顺序执行多个异步操作时,使用 `async/await` 可以让代码更简洁易读。
### 1.3.3 事件循环
JavaScript 是单线程的,通过事件循环机制实现异步操作。事件循环主要包括调用栈、任务队列和微任务队列。调用栈用于执行同步代码,任务队列存放异步操作完成后的回调函数,微任务队列存放 Promise 的回调函数。事件循环会不断检查调用栈是否为空,若为空则从任务队列和微任务队列中取出任务执行。
```javascript
console.log('Start');
setTimeout(() => {
console.log('Timeout');
}, 0);
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('End');
// 输出顺序:Start -> End -> Promise -> Timeout
```
使用场景:处理异步操作,保证代码的执行顺序符合预期。
## 1.4 ES6+ 特性
### 1.4.1 解构赋值
```javascript
// 数组解构
let [first, second] = [1, 2];
console.log(first); // 1
console.log(second); // 2
// 对象解构
let { name, age } = { name: 'John', age: 30 };
console.log(name); // John
console.log(age); // 30
```
### 1.4.2 扩展运算符
```javascript
// 数组扩展
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let combined = [...arr1, ...arr2];
console.log(combined); // [1, 2, 3, 4, 5, 6]
// 对象扩展
let obj1 = { a: 1 };
let obj2 = { b: 2 };
let merged = { ...obj1, ...obj2 };
console.log(merged); // { a: 1, b: 2 }
```
### 1.4.3 类
```javascript
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
let person = new Person('John', 30);
person.greet(); // Hello, my name is John and I am 30 years old.
```
### 1.4.4 模块化
#### 导出模块
```javascript
// math.js
export function add(a, b) {
return a + b;
}
export const PI = 3.14;
```
#### 导入模块
```javascript
// main.js
import { add, PI } from './math.js';
console.log(add(3, 5)); // 8
console.log(PI); // 3.14
```
### 1.4.5 模板字符串
```javascript
let name = 'John';
let age = 30;
let message = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(message);
```
### 1.4.6 默认参数
```javascript
function greet(name = 'Guest') {
console.log(`Hello, ${name}!`);
}
greet(); // Hello, Guest!
greet('John'); // Hello, John!
```
### 1.4.7 Rest 参数
```javascript
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5)); // 15
```
### 1.4.8 Spread 参数
```javascript
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let combined = [...arr1, ...arr2];
console.log(combined); // [1, 2, 3, 4, 5, 6]
let obj1 = { a: 1 };
let obj2 = { b: 2 };
let merged = { ...obj1, ...obj2 };
console.log(merged); // { a: 1, b: 2 }
```
### 1.4.9 Proxy
```javascript
let target = { name: 'John', age: 30 };
let handler = {
get: function(target, prop) {
console.log(`Getting property ${prop}`);
return target[prop];
},
set: function(target, prop, value) {
console.log(`Setting property ${prop} to ${value}`);
target[prop] = value;
return true;
}
};
let proxy = new Proxy(target, handler);
console.log(proxy.name); // Getting property name
// John
proxy.age = 31; // Setting property age to 31
```
### 1.4.10 Reflect
```javascript
let target = { name: 'John', age: 30 };
console.log(Reflect.get(target, 'name')); // John
Reflect.set(target, 'age', 31);
console.log(target.age); // 31
```
## 1.5 闭包
```javascript
function outer() {
let outerVar = 'I am outside';
function inner() {
console.log(outerVar);
}
return inner;
}
let closure = outer();
closure(); // I am outside
```
## 1.6 原型与继承
### 1.6.1 原型链
```javascript
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name} makes a noise.`);
};
let dog = new Animal('Dog');
// 先在 dog 对象本身查找 speak 方法,找不到则去 Animal.prototype 中查找
dog.speak(); // Dog makes a noise.
```
### 1.6.2 继承
```javascript
function Dog(name) {
// 构造函数继承,继承父类的属性
Animal.call(this, name);
}
// 原型链继承,继承父类的方法
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
console.log(`${this.name} barks.`);
};
let myDog = new Dog('Buddy');
myDog.speak(); // Buddy makes a noise.
myDog.bark(); // Buddy barks.
```
## 1.7 浏览器 API
### 1.7.1 DOM 操作
```javascript
// 获取元素
let element = document.getElementById('myElement');
// 创建元素
let newElement = document.createElement('p');
newElement.textContent = 'This is a new paragraph.';
// 添加元素
let parent = document.body;
parent.appendChild(newElement);
// 修改元素样式
newElement.style.color = 'red';
```
### 1.7.2 事件处理
```javascript
let button = document.getElementById('myButton');
button.addEventListener('click', function() {
alert('Button clicked!');
});
```
### 1.7.3 本地存储
```javascript
// 设置本地存储
localStorage.setItem('name', 'John');
// 获取本地存储
let name = localStorage.getItem('name');
console.log(name); // John
// 删除本地存储
localStorage.removeItem('name');
```
### 1.7.4 定时器
```javascript
// setTimeout
setTimeout(function() {
console.log('This will be executed after 2 seconds');
}, 2000);
// setInterval
let intervalId = setInterval(function() {
console.log('This will be executed every 1 second');
}, 1000);
// 清除定时器
clearInterval(intervalId);
```
## 1.8 Node.js
### 1.8.1 文件系统操作
```javascript
const fs = require('fs');
// 读取文件
fs.readFile('example.txt', 'utf8', function(err, data) {
if (err) throw err;
console.log(data);
});
// 写入文件
fs.writeFile('example.txt', 'Hello, Node.js!', function(err) {
if (err) throw err;
console.log('File written successfully');
});
```
### 1.8.2 模块系统
```javascript
// module.js
const add = (a, b) => a + b;
module.exports = {
add
};
// main.js
const myModule = require('./module');
console.log(myModule.add(3, 5)); // 8
```
### 1.8.3 HTTP 服务器
```javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});
```
## 1.9 正则表达式
### 1.9.1 基本语法
```javascript
let pattern = /abc/;
let str = 'abcdef';
console.log(pattern.test(str)); // true
```
### 1.9.2 元字符
```javascript
// 匹配任意字符
let pattern = /a.c/;
let str = 'abc';
console.log(pattern.test(str)); // true
// 匹配开始位置
let pattern = /^a/;
let str = 'abc';
console.log(pattern.test(str)); // true
// 匹配结束位置
let pattern = /c$/;
let str = 'abc';
console.log(pattern.test(str)); // true
```
### 1.9.3 量词
```javascript
// 匹配零个或多个
let pattern = /a*/;
let str = 'aaaa';
console.log(pattern.test(str)); // true
// 匹配一个或多个
let pattern = /a+/;
let str = 'aaaa';
console.log(pattern.test(str)); // true
// 匹配零个或一个
let pattern = /a?/;
let str = 'a';
console.log(pattern.test(str)); // true
```
## 1.10 错误处理
### 1.10.1 try...catch
```javascript
try {
let result = 1 / 0;
if (result === Infinity) {
throw new Error('Division by zero');
}
} catch (error) {
console.error(error.message); // Division by zero
} finally {
console.log('This will always be executed');
}
```
### 1.10.2 自定义错误
```javascript
class CustomError extends Error {
constructor(message) {
super(message);
this.name = 'CustomError';
}
}
try {
throw new CustomError('This is a custom error');
} catch (error) {
console.error(error.name + ': ' + error.message); // CustomError: This is a custom error
}
## 1.11 Web API 扩展
### 1.11.1 Fetch API
Fetch API 提供了一个 JavaScript 接口用于访问和操纵 HTTP 管道的部分例如请求和响应它还提供了一个全局 `fetch()` 方法该方法提供了一种简单合理的方式来跨网络异步获取资源
```javascript
// 基本用法
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});
// 带请求体的 POST 请求
const postData = {
name: 'John Doe',
age: 30
};
fetch('https://api.example.com/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(postData)
})
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});
```
### 1.11.2 Web Workers
Web Workers 使得一个 Web 应用程序可以在与主执行线程分离的后台线程中运行一个脚本操作。这样做的好处是可以在一个单独的线程中执行费时的处理任务,从而允许主(通常是 UI)线程继续运行而不被阻塞。
```javascript
// main.js
if (typeof Worker !== 'undefined') {
// 创建一个新的 worker
const worker = new Worker('worker.js');
// 向 worker 发送消息
worker.postMessage('Hello from main script');
// 接收 worker 的消息
worker.onmessage = function(e) {
console.log('Received message from worker:', e.data);
// 终止 worker
worker.terminate();
};
worker.onerror = function(error) {
console.error('Worker error:', error.message);
};
} else {
console.error('Web Workers are not supported in this environment.');
}
// worker.js
self.onmessage = function(e) {
console.log('Received message from main script:', e.data);
// 向主脚本发送消息
self.postMessage('Hello from worker');
};
```
### 1.11.3 WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
```javascript
// 客户端代码
const socket = new WebSocket('ws://echo.websocket.org');
// 连接建立时触发
socket.addEventListener('open', function (event) {
socket.send('Hello, WebSocket!');
});
// 接收到消息时触发
socket.addEventListener('message', function (event) {
console.log('Received message:', event.data);
});
// 连接关闭时触发
socket.addEventListener('close', function (event) {
if (event.wasClean) {
console.log('Connection closed cleanly');
} else {
console.log('Connection died');
}
});
// 发生错误时触发
socket.addEventListener('error', function (event) {
console.error('WebSocket error:', event);
});
```
## 1.12 性能优化
### 1.12.1 代码压缩与混淆
代码压缩和混淆是提高网站性能的重要手段。压缩可以减少代码的体积,从而减少网络传输时间;混淆可以使代码更难被逆向工程,同时也能进一步减小代码体积。
```javascript
// 示例:使用 UglifyJS 压缩代码
const UglifyJS = require('uglify-js');
const code = 'function add(a, b) { return a + b; }';
const result = UglifyJS.minify(code);
if (result.error) {
console.error('Error:', result.error);
} else {
console.log('Minified code:', result.code);
}
```
### 1.12.2 懒加载
懒加载是一种优化技术,它允许你在需要时才加载资源,而不是在页面加载时就全部加载。这可以显著减少初始加载时间,提高用户体验。
```html
<!-- 图片懒加载示例 -->
<img loading="lazy" src="image.jpg" alt="Lazy loaded image">
<!-- JavaScript 模块懒加载示例 -->
<button id="loadModule">Load Module</button>
<script>
const loadModuleButton = document.getElementById('loadModule');
loadModuleButton.addEventListener('click', async () => {
const { default: myModule } = await import('./myModule.js');
myModule.doSomething();
});
</script>
```
### 1.12.3 事件委托
事件委托是一种利用事件冒泡机制来处理事件的技术。通过将事件监听器添加到父元素上,可以减少事件监听器的数量,从而提高性能。
```html
<ul id="myList">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<script>
const myList = document.getElementById('myList');
myList.addEventListener('click', function(event) {
if (event.target.tagName === 'LI') {
console.log('Clicked on:', event.target.textContent);
}
});
</script>
```
## 1.13 设计模式
### 1.13.1 单例模式
单例模式确保一个类只有一个实例,并提供一个全局访问点。
```javascript
class Singleton {
constructor() {
if (!Singleton.instance) {
this.data = [];
Singleton.instance = this;
}
return Singleton.instance;
}
addItem(item) {
this.data.push(item);
}
getItems() {
return this.data;
}
}
const singleton1 = new Singleton();
const singleton2 = new Singleton();
singleton1.addItem('Item 1');
console.log(singleton2.getItems()); // ['Item 1']
```
### 1.13.2 观察者模式
观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
```javascript
class Subject {
constructor() {
this.observers = [];
}
subscribe(observer) {
this.observers.push(observer);
}
unsubscribe(observer) {
this.observers = this.observers.filter(obs => obs !== observer);
}
notify(data) {
this.observers.forEach(observer => observer.update(data));
}
}
class Observer {
constructor(name) {
this.name = name;
}
update(data) {
console.log(`${this.name} received data: ${data}`);
}
}
const subject = new Subject();
const observer1 = new Observer('Observer 1');
const observer2 = new Observer('Observer 2');
subject.subscribe(observer1);
subject.subscribe(observer2);
subject.notify('Hello, observers!');
```
### 1.13.3 工厂模式
工厂模式是一种创建对象的设计模式,它将对象的创建和使用分离,通过一个工厂函数来创建对象。
```javascript
class Product {
constructor(name) {
this.name = name;
}
showInfo() {
console.log(`This is a ${this.name}`);
}
}
function productFactory(name) {
return new Product(name);
}
const product1 = productFactory('Laptop');
const product2 = productFactory('Smartphone');
product1.showInfo(); // This is a Laptop
product2.showInfo(); // This is a Smartphone
```
## 1.14 测试与调试
### 1.14.1 单元测试
单元测试是对软件中的最小可测试单元进行检查和验证。在 JavaScript 中,常用的单元测试框架有 Jest、Mocha 等。
```javascript
// math.js
function add(a, b) {
return a + b;
}
module.exports = add;
// math.test.js
const add = require('./math');
const { test, expect } = require('@jest/globals');
test('adds 1 + 2 to equal 3', () => {
expect(add(1, 2)).toBe(3);
});
```
### 1.14.2 调试技巧
在 JavaScript 中,可以使用浏览器的开发者工具进行调试。常用的调试技巧包括设置断点、使用 `console.log()` 输出调试信息等。
```javascript
function calculateSum(arr) {
let sum = 0;
for (let i = 0; i < arr.length; i++) {
console.log(`Current element: ${arr[i]}`);
sum += arr[i];
}
return sum;
}
const numbers = [1, 2, 3, 4, 5];
const result = calculateSum(numbers);
console.log(`Sum: ${result}`);
```
## 1.15 安全相关
### 1.15.1 XSS 防护
跨站脚本攻击(XSS)是一种常见的 Web 安全漏洞,攻击者通过注入恶意脚本到网页中,从而窃取用户信息。可以通过对用户输入进行过滤和转义来防止 XSS 攻击。
```javascript
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
const userInput = '<script>alert("XSS")</script>';
const safeInput = escapeHtml(userInput);
console.log(safeInput); // &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;
```
### 1.15.2 CSRF 防护
跨站请求伪造(CSRF)是一种通过伪造用户请求来执行恶意操作的攻击。可以通过使用 CSRF Token 来防止 CSRF 攻击。
```javascript
// 服务器端生成 CSRF Token
const csrfToken = 'abc123';
// 客户端发送请求时携带 CSRF Token
fetch('https://api.example.com/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken
},
body: JSON.stringify({ data: 'example' })
})
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});
```
## 1.16 国际化与本地化
### 1.16.1 Intl 对象
Intl 对象是 ECMAScript 国际化 API 的命名空间,它提供了格式化数字、日期和时间以及比较字符串的功能。
```javascript
// 格式化日期
const date = new Date();
const options = { year: 'numeric', month: 'long', day: 'numeric' };
const formatter = new Intl.DateTimeFormat('zh-CN', options);
console.log(formatter.format(date));
// 格式化数字
const number = 1234567.89;
const numberFormatter = new Intl.NumberFormat('zh-CN', {
style: 'currency',
currency: 'CNY'
});
console.log(numberFormatter.format(number)); // ¥1,234,567.89
```
### 1.16.2 多语言支持
在 JavaScript 中,可以通过动态加载不同语言的资源文件来实现多语言支持。
```javascript
// 语言资源文件 en.js
const en = {
greeting: 'Hello!',
welcome: 'Welcome to our website.'
};
// 语言资源文件 zh.js
const zh = {
greeting: '你好!',
welcome: '欢迎来到我们的网站。'
};
// 动态加载语言资源
function loadLanguage(lang) {
if (lang === 'en') {
return en;
} else if (lang === 'zh') {
return zh;
}
}
const currentLang = 'zh';
const langResources = loadLanguage(currentLang);
console.log(langResources.greeting); // 你好!
```
## 1.17 服务端渲染(SSR)与静态站点生成(SSG)
### 1.17.1 服务端渲染
服务端渲染是指在服务器端将组件或页面渲染成 HTML 字符串,然后发送给客户端。这样可以提高首屏加载速度,有利于 SEO。
```javascript
// 使用 Node.js 和 Express 进行简单的服务端渲染
const express = require('express');
const app = express();
app.get('/', (req, res) => {
const html = `<!DOCTYPE html>
<html>
<head>
<title>Server-Side Rendering</title>
</head>
<body>
<h1>Hello, Server-Side Rendering!</h1>
</body>
</html>`;
res.send(html);
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
```
### 1.17.2 静态站点生成
静态站点生成是指在构建时将组件或页面渲染成静态 HTML 文件,然后部署到服务器。这样可以提供更快的加载速度和更好的性能。
```javascript
// 使用 Next.js 进行静态站点生成
// pages/index.js
import React from 'react';
const HomePage = () => {
return (
<div>
<h1>Hello, Static Site Generation!</h1>
</div>
);
};
export async function getStaticProps() {
// 可以在这里获取数据
return {
props: {},
revalidate: 60 * 60 // 每小时重新生成一次
};
};
export default HomePage;
```
## 1.18 代码规范与最佳实践
### 1.18.1 ESLint 配置
ESLint 是一个用于识别和报告 JavaScript 代码中模式问题的工具。可以通过配置 ESLint 来强制执行代码规范。
```json
// .eslintrc.json
{
"extends": "eslint:recommended",
"rules": {
"semi": ["error", "always"],
"quotes": ["error", "single"]
}
}
```
### 1.18.2 模块化开发
模块化开发可以提高代码的可维护性和可复用性。在 JavaScript 中,可以使用 ES6 模块或 CommonJS 模块。
```javascript
// 示例:ES6 模块
// utils.js
export function add(a, b) {
return a + b;
}
// main.js
import { add } from './utils.js';
const result = add(3, 5);
console.log(result); // 8
```
### 1.18.3 避免全局变量
全局变量可能会导致命名冲突和代码难以维护。应该尽量避免使用全局变量,而是使用模块作用域或函数作用域。
```javascript
// 不好的做法
var globalVar = 'This is a global variable';
// 好的做法
function myModule() {
const localVar = 'This is a local variable';
return localVar;
}
const result = myModule();
console.log(result); // This is a local variable
```
## 1.19 构建工具
### 1.19.1 Webpack
Webpack 是一个现代 JavaScript 应用程序的静态模块打包器。它可以将多个模块打包成一个或多个文件。
```javascript
// webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
},
module: {
rules: [
{ test: /\.js$/, exclude: /node_modules/, use: 'babel-loader' }
]
}
};
```
### 1.19.2 Vite
Vite 是一个面向现代浏览器的前端构建工具,它具有快速的冷启动和热更新能力。
```bash
# 创建 Vite 项目
npm init vite@latest my-project -- --template react
cd my-project
npm install
npm run dev
```
## 1.20 前沿技术与趋势
### 1.20.1 WebAssembly
WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生性能运行,并为诸如 C、C++ 等语言提供一个编译目标,以便它们可以在 Web 上运行。
```javascript
// 加载 WebAssembly 模块
async function loadWasm() {
const response = await fetch('example.wasm');
const buffer = await response.arrayBuffer();
const module = await WebAssembly.compile(buffer);
const instance = await WebAssembly.instantiate(module);
const result = instance.exports.add(3, 5);
console.log(result); // 8
}
loadWasm();
```
### 1.20.2 渐进式 Web 应用(PWA
渐进式 Web 应用是一种可以提供类似原生应用体验的 Web 应用。它具有离线访问、推送通知等功能。
```javascript
// service-worker.js
self.addEventListener('install', function(event) {
event.waitUntil(
caches.open('my-cache').then(function(cache) {
return cache.addAll([
'/',
'/index.html',
'/styles.css',
'/script.js'
]);
})
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request).then(function(response) {
return response || fetch(event.request);
})
);
});
```
This concludes the comprehensive guide to JavaScript, covering everything from basic syntax to advanced features and modern web development trends.`}}}