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 更推荐新项目使用)。
相关推荐
eason_fan7 天前
Rspack核心解析:Rust重写Webpack的性能革命与本质
前端·前端工程化
怒放的生命19917 天前
pnpm + Monorepo 使用教程(集成 Vue 3 项目)
前端·vue.js·pnpm·monorepo·前端工程化
Mintopia9 天前
意图OS是未来软件形态,它到底解决了什么问题?
人工智能·react native·前端工程化
眯眼因为很困啦12 天前
GitHub Fork 协作完整流程
前端·git·前端工程化
myltx12 天前
node-sass 迁移 sass(dart-sass) 后样式报错?用 loader 先把构建救回来
vue.js·前端工程化
user861581857815414 天前
记一次Vue 2主应用集成Vue 3子项目的Monorepo迁移踩坑指南
前端工程化
Eadia14 天前
React基础框架搭建8-axios封装与未封装,实现 API 请求管理:react+router+redux+axios+Tailwind+webpack
react.js·前端框架·前端工程化
前端小万16 天前
告别 CJS 库加载兼容坑
前端·前端工程化
eason_fan17 天前
前端性能优化利器:LitePage 轻量级全页设计解析
前端·性能优化·前端工程化
Awu122717 天前
⚡全局自动化:我用Vite插件为所有CRUD组件一键添加指令
前端·vite·前端工程化