下载工作台
前端开发入门

浏览器、Node 与 JavaScript 运行时差异

试读上半部分 · 解锁后可读全文

第 18 章 · 浏览器、Node 与 JavaScript 运行时差异

本章目标:从运行时环境理解前端工程化——浏览器与 Node.js 各提供什么 API;CJS 与 ESM 如何共存;package.json 与包管理器如何影响构建;Polyfill、Babel、browserslist 如何衔接现代语法与目标浏览器。本章是 frontend-web 收官,衔接 frontend-framework

前置:ch01~ch17;Node.js 18+。学时:3~4 小时。


18.1 两个 JavaScript 世界

同一份 .js 在浏览器与 Node 中表现不同,因宿主环境注入的全局对象与 API 不同;ECMAScriptletPromiseclass)才是共用语言层。

浏览器:window, document, DOM, fetch, localStorage
Node.js:process, fs, path, http, npm CLI
         └──── 共用 ECMAScript 语法 ────┘
行业案例 · 贤紫优选商城:订单导出脚本在 Node 读 MySQL;运营后台 Vue 在浏览器调 REST。在 Node 里写 document.querySelector 会立刻报错。

18.2 浏览器 vs Node.js 对比表

维度浏览器Node.js
全局对象windowglobal / globalThis
DOMdocumentHTMLElement
文件系统仅用户选取文件fspath
网络fetchWebSockethttp/httpsfetch(18+)
模块ES Module(<script type="module">CJS 历史默认 + ESM
包管理消费构建产物npm install、运行 Vite
安全同源策略、CSP可访问本机与内网
用途页面交互构建、BFF、脚本、SSR

快速验证

// 浏览器控制台
typeof window;    // "object"
typeof require;   // undefined(无 bundler)

// Node REPL
typeof window;    // "undefined"
typeof process;   // "object"

18.3 CommonJS vs ESM

特性CommonJSES Module
语法require / module.exportsimport / export
加载运行时同步编译时静态分析
Tree Shaking困难支持
浏览器不支持原生支持
Node默认(无 type"type":"module".mjs

academy-demo(浏览器 + Vite)

import { fetchCourses } from '../api/client.js';
export function mountHome(root) { /* ... */ }

CJS / ESM 互操作(Node 18+)

// CJS 中动态 import ESM
const { readFile } = await import('node:fs/promises');

// ESM 中引用 JSON(legacy)
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const cfg = require('./legacy.json');
场景建议
Vite 项目统一 ESM,"type": "module"
发布 npm 库exports 声明 import/require 双入口

常见错误:浏览器未打包直接 require()ReferenceError: require is not defined


18.4 包管理器对比

工具锁文件特点
npmpackage-lock.jsonNode 自带,学院默认
pnpmpnpm-lock.yaml省磁盘、依赖隔离严
yarnyarn.lockBerry 版与 npm 差异大
npm install          # 开发装依赖
npm ci               # CI 严格按 lock
npx vite             # 执行本地 CLI

勿混用多种 lock 文件,避免版本漂移。


18.5 package.json 字段详解

{
  "name": "academy-demo",
  "private": true,
  "type": "module",
  "engines": { "node": ">=18.0.0" },
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "exports": { ".": "./src/main.js" },
  "browserslist": ["> 0.5%", "last 2 versions", "not dead"],
  "devDependencies": { "vite": "^6.0.0" }
}
字段含义
type: "module".js 按 ESM 解析
engines声明 Node 版本,CI 对齐
exports限制包对外入口,支持 import/require 映射
scriptsnpm run <key> 命令
browserslistBabel、Autoprefixer、plugin-legacy 读取
dependencies运行时依赖
devDependencies构建期依赖(Vite)

库作者 exports 示例:

"exports": {
  ".": { "import": "./dist/index.mjs", "require": "./dist/index.cjs" },
  "./style.css": "./dist/style.css"
}

18.6 浏览器 API 与 Node API 对照

需求浏览器Node.js
HTTPfetch(url)fetchhttp.request
读文件<input type="file">fs.readFile

以下内容需解锁后阅读

试读已结束。解锁本章 ¥5.00,或开通年度会员畅读全部教程。
年度会员 ¥199.00/年; 小紫 AI 工作台有效会员 ¥99.00/年

正文仅在服务端鉴权后下发,未付费无法获取下半部分内容。