简单聊一聊单例设计模式

你是否曾经遇到过需要在应用程序的多个部分共享一个对象的情况,比如数据库连接、WebSocket 客户端或配置管理器或全局的 Logger 对象? 你如何管理这样一个对象,使其在整个应用程序或进程生命周期中保持一致且可访问?这就是单例设计模式发挥作用的地方。 概述 单例是一种创建型设计模式,属于设计模式的一类,用于解决使用new关键字或操作符创建对象的原生方式所带来的不同问题。 单例设计模式主要致力于解决两个主要问题: 我们如何为实例提供一个全局访问点? 我们如何确保一个类或特定类型的对象只有一个实例? 它可以简化并规范我们管理特定种类或类型的全局状态的方式,例如数据库连接、WebSocket 客户端、缓存服务,或者任何我们在整个应用程序生命周期中需要在内存中持久化和修改的内容。 如何实现单例设计模式 class Singleton { private static instance: Singleton private construct() { // 私有构造函数确保只能通过静态方法创建唯一实例 } public static getInstance () { if (!this.instance) { this.instance = new Singleton() } return this.instance } } 该类应该定义一个静态属性来存储唯一可共享的实例。static 关键字意味着实例对象与类的实例无关,而是与类定义本身相关联。类的构造函数应该标记为private 则无法通过 new 创建实例。获取类实例的唯一方法是调用 getInstance 静态方法。 const instance = Singleton.getInstance() 我们可以通过调用与单例类相关联的静态方法getInstance来使用上述类。getInstance 方法保证即使我们在代码库的不同位置多次实例化我们的类,我们始终得到相同的实例。 第一个实际场景 在 node 服务中,需要记录调用接口产生的 log,因此要设计一个全局的 Logger 集中管理日志行为。 class Logger { private static instance: Logger; private logs: string[] = []; private constructor() {} public static getInstance(): Logger { if (!Logger.instance) { Logger.instance = new Logger(); } return Logger.instance; } public log(message: string) { this.logs.push(message); } } // 使用 const logger = Logger.getInstance(); logger.log('Application started'); 在这个例子中,private constructor() 确保: ...

November 24, 2018 · 2 min · 279 words · Link

vite 开发环境编译流程

Vite 的开发环境采用按需编译和原生 ES 模块驱动的架构,与传统打包工具(如 Webpack)有本质区别。以下是其编译流程及对不同文件类型的处理方式: 一、Vite 开发环境核心原理 启动服务器: Vite 启动时不进行全量编译,而是创建一个 HTTP 服务器,监听文件变化。 浏览器优先原则: 浏览器直接通过 ES 模块的 import 语句请求文件(如 import './main.ts'),Vite 拦截这些请求并实时编译。 按需编译: 只有当浏览器请求某个模块时,Vite 才会对其进行编译(如 TS 转 JS、Less 转 CSS),并返回处理后的结果。 二、不同文件类型的处理流程 1. Less 文件处理 请求拦截:当浏览器请求 .less 文件时,Vite 拦截该请求。 编译:使用 less 编译器将 Less 转换为 CSS。 注入:将 CSS 通过 JavaScript 动态注入到页面的 <style> 标签中(支持 HMR 热更新)。 2. TS 文件处理 请求拦截:拦截 .ts 文件请求。 编译:使用 esbuild(速度极快)将 TS 转换为 JS,仅进行语法转换(不做类型检查)。 类型检查:类型检查由独立进程(如 VSCode 插件或 tsc --watch)完成,不阻塞开发服务器。

June 5, 2018 · 1 min · 68 words · Link