在 Node.js 应用里,过多使用全局变量会带来命名冲突、内存管理困难等问题,因此有必要减少全局变量的使用。下面是一些可行的方法:
模块化设计
- 使用 ES6 模块:ES6 模块的作用域是模块级别的,能够有效避免全局变量的产生。可以把功能封装到不同的模块中,通过
export
和import
语句来共享数据和功能。
```javascript
// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
// main.js
import { add, subtract } from './math.js';
console.log(add(5, 3));
console.log(subtract(5, 3));
- **CommonJS 模块**:在 Node.js 传统开发中,使用 `module.exports` 和 `require` 来实现模块化。把相关功能封装在不同的文件中,通过 `require` 引入使用。
```javascript
// utils.js
const multiply = (a, b) => a * b;
module.exports = {
multiply
};
// main.js
const utils = require('./utils.js');
console.log(utils.multiply(5, 3));
函数作用域
- 使用立即执行函数表达式(IIFE):把代码包裹在 IIFE 中,使变量的作用域局限于函数内部,避免成为全局变量。
(function() { const localVar = 'This is a local variable'; console.log(localVar); })();
- 封装函数:将相关的逻辑封装到函数中,在函数内部定义变量,仅在需要时将函数的结果返回。
function calculateSum() { const num1 = 5; const num2 = 3; return num1 + num2; } const result = calculateSum(); console.log(result);
依赖注入
- 传递参数:在函数或类中,通过参数传递所需的数据,而不是依赖全局变量。这样可以使代码更具独立性和可测试性。
function printMessage(message) { console.log(message); } const myMessage = 'Hello, World!'; printMessage(myMessage);
- 构造函数注入:在类的构造函数中传入所需的依赖,避免使用全局变量。
class Logger { constructor(logLevel) { this.logLevel = logLevel; } log(message) { console.log(`[${ this.logLevel}] ${ message}`); } } const logger = new Logger('INFO'); logger.log('This is an info message');
状态管理模式
- 单例模式:当需要共享状态时,可以使用单例模式来管理,确保只有一个实例存在,避免全局变量的使用。
class AppConfig { constructor() { if (!AppConfig.instance) { this.config = { apiKey: 'your - api - key', baseUrl: 'https://example.com' }; AppConfig.instance = this; } return AppConfig.instance; } getConfig() { return this.config; } } const config = new AppConfig(); console.log(config.getConfig().apiKey);