CommonJS、ES、包管理器

CMJ 规范:

  1. 所有的 js 文件均是一个模块,运行的模块为入口模块
  2. 所有的模块中的全局变量、函数,均不会产生污染
  3. 当一个模块需要提供一些东西给别的模块使用时,需要把这些东西「导出」
  4. 当一个模块需要用到别的模块的东西的时候,需要「导入」(模块路径必须以 ./ 或 ../ 开头)
  5. 模块有缓存,第一次运行模块后,导出结果会被缓存,之后再使用该模块,直接使用缓存结果

一、CommonJS 模块

CommonJS 是Node.js 早期的模块化规范,主要为服务端设计,解决了 JavaScript 没有原生模块化的问题。

核心特点与用法

  • 导出(exports/module.exports) :定义模块对外暴露的内容
  • 导入(require ()) :加载其他模块

javascript

运行

javascript 复制代码
// 模块文件:math.js (CommonJS 写法)
// 方式1:单个导出
exports.add = (a, b) => a + b;
exports.sub = (a, b) => a - b;

// 方式2:整体导出(更常用)
module.exports = {
  add: (a, b) => a + b,
  sub: (a, b) => a - b
};

// 导入模块:index.js
const math = require('./math.js');
console.log(math.add(1, 2)); // 输出 3

关键特性

  • 同步加载模块(适合服务端,文件读取快)
  • 运行时加载(执行到 require 才加载模块)
  • 每个模块是独立的作用域,避免全局变量污染

二、ES 模块(ES Modules,简称 ESM)

ES 模块是 ES6 原生支持的模块化规范,目前是浏览器和 Node.js 通用的标准模块化方案。

核心特点与用法

  • 导出(export) :分按需导出、默认导出
  • 导入(import) :分按需导入、默认导入

javascript

运行

javascript 复制代码
// 模块文件:math.js (ES 模块写法)
// 方式1:按需导出
export const add = (a, b) => a + b;
export const sub = (a, b) => a - b;

// 方式2:默认导出(一个模块只能有一个默认导出)
export default {
  add: (a, b) => a + b,
  sub: (a, b) => a - b
};

// 导入模块:index.js
// 按需导入
import { add, sub } from './math.js';
// 默认导入(可自定义名称)
import math from './math.js';

console.log(add(1, 2)); // 输出 3
console.log(math.sub(5, 3)); // 输出 2

关键特性

  • 异步加载模块(适合浏览器,避免阻塞渲染)
  • 编译时加载(解析阶段就确定依赖,支持树摇优化)
  • 需在文件开头声明,或通过 type="module" 让浏览器识别(如 <script type="module" src="index.js"></script>

CommonJS vs ES 模块 核心区别

特性 CommonJS ES 模块
加载时机 运行时加载 编译时加载
加载方式 同步 异步(浏览器)/ 同步 + 异步(Node.js)
导出 / 导入关键字 module.exports/require export/import
可修改导出内容 可以(动态) 不可以(静态)
适用环境 主要 Node.js 浏览器 + Node.js(v14+)

三、包管理器

包管理器是管理 JavaScript 第三方包(模块)的工具,核心功能:下载、安装、更新、卸载包,管理包的版本依赖。

主流包管理器

1. npm(Node Package Manager)
  • Node.js 自带的默认包管理器,生态最丰富

  • 核心命令:

    bash

    运行

    csharp 复制代码
    # 初始化项目(生成 package.json)
    npm init -y
    # 安装包(生产依赖)
    npm install axios
    # 安装包(开发依赖)
    npm install --save-dev webpack
    # 卸载包
    npm uninstall axios
    # 更新包
    npm update axios
2. yarn
  • 由 Facebook 开发,解决 npm 早期的性能和依赖一致性问题

  • 核心命令(和 npm 基本兼容):

    bash

    运行

    csharp 复制代码
    yarn init -y
    yarn add axios          # 生产依赖
    yarn add -D webpack     # 开发依赖
    yarn remove axios
    yarn upgrade axios
3. pnpm
  • 新一代包管理器,磁盘占用更少、安装速度更快(采用硬链接 / 符号链接复用包)

  • 核心命令(兼容 npm/yarn):

    bash

    运行

    csharp 复制代码
    pnpm init -y
    pnpm add axios
    pnpm add -D webpack
    pnpm remove axios
    pnpm update axios

核心文件说明

  • package.json:记录项目名称、版本、依赖包等核心信息,是包管理器的核心配置文件
  • package-lock.json/yarn.lock/pnpm-lock.yaml:锁定包的精确版本,保证不同环境安装的依赖版本一致

总结

  1. CommonJS 是 Node.js 早期模块化规范,用 require/module.exportsES 模块 是原生标准,用 import/export,支持浏览器和现代 Node.js。
  2. 包管理器(npm/yarn/pnpm)的核心作用是管理第三方模块,解决依赖安装、版本控制问题,其中 npm 生态最广,pnpm 性能最优。
  3. 实际开发中,Node.js 项目可混用两种模块(需配置),浏览器端优先用 ES 模块,包管理器根据项目需求选择即可(npm 是基础,pnpm 更推荐新项目使用)。
相关推荐
止观止12 小时前
告别全局污染:深入理解 ES Modules 模块化与构建工具
javascript·webpack·vite·前端工程化·es modules
转转技术团队8 天前
基于微前端 qiankun 多实例保活的工程实践
前端·javascript·前端工程化
Maxkim8 天前
一文读懂 Chrome CRX📦:你需要了解的核心知识点
前端·前端工程化
有意义10 天前
从 useState 到 useEffect:React Hooks 核心机制详解
javascript·react.js·前端工程化
有意义10 天前
让宠物打冰球!手把手教你用 Coze 多模态工作流 + Vue 3 打造 AI 拟人生成器
vue.js·前端工程化·coze
行走的陀螺仪12 天前
前端基建从0到1搭建步骤清单(含工具选型+配置要点+落地注意事项)
前端·javascript·typescript·设计规范·前端工程化·规范化·前端基建
行走的陀螺仪13 天前
Vite & Webpack 插件/Loader 封装完全指南
前端·webpack·node.js·vite·前端工程化·打包构建
神奇的程序员14 天前
从已损坏的备份中拯救数据
运维·后端·前端工程化
5C2414 天前
从思想到实践:前端工程化体系与 Webpack 构建架构深度解析
前端·前端工程化