Vue 传统全局引入方式,ES 模块化方式引入 对比

以下是对两个 Vue 3 示例代码的详细对比分析,它们在实现相同功能时采用了不同的技术方案:


示例 1:传统全局引入方式

html复制代码

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
  <!-- 全局引入 Vue 3 -->
  <script src="https://cdn.staticfile.net/vue/3.0.5/vue.global.js"></script>
</head>
<body>
  <div id="hello-vue" class="demo">
    {{ message }}
  </div>

  <script>
    // 定义应用配置对象
    const HelloVueApp = {
      data() {
        return {
          message: 'Hello Vue!!'
        }
      }
    }

    // 使用全局 Vue 对象创建应用
    Vue.createApp(HelloVueApp).mount('#hello-vue')
  </script>
</body>
</html>

示例 2:ES 模块化方式

html复制代码

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
</head>
<body>
  <div id="app">{{ message }}</div>

  <!-- 使用 ES 模块 -->
  <script type="module">
    // 从 CDN 导入特定 API
    import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
    
    // 直接创建应用
    createApp({
      data() {
        return {
          message: 'Hello RUNOOB!'
        }
      }
    }).mount('#app')
  </script>
</body>
</html>

核心差异对比表

特性 示例 1 (传统全局引入) 示例 2 (ES 模块化) 优势分析
Vue 引入方式 <script src="vue.global.js"> import { createApp } from '...' 示例 2 更现代,避免全局命名污染
脚本类型 普通脚本 (<script>) ES 模块 (<script type="module">) 示例 2 支持模块化开发
API 使用 Vue.createApp() (全局对象) createApp() (按需导入) 示例 2 更符合现代框架使用习惯
构建版本 vue.global.js (完整运行时) vue.esm-browser.js (ESM 优化版) 示例 2 支持 Tree-shaking 潜力
数据定义 命名配置对象 (HelloVueApp) 匿名配置对象 (直接内联) 示例 2 更简洁
挂载点 #hello-vue (带 class) #app (更简洁) 无本质差异
浏览器兼容性 IE11+ (兼容性好) 现代浏览器 (Chrome/Firefox/Edge/Safari) 示例 1 兼容性更好
应用场景 快速原型/简单页面/兼容旧浏览器 现代项目/学习 ES 模块/无构建工具开发 根据需求选择
包体积 ~40KB (完整运行时) ~40KB (但支持按需加载) 示例 2 有优化空间

关键差异详解

  1. 模块系统演进

    • 示例 1 :使用传统的全局变量模式(IIFE 打包)
      • 将整个 Vue 库绑定到 window.Vue
      • 所有功能全局可用
    • 示例 2 :使用原生 ES 模块
      • 只导入需要的 createApp 函数
      • 避免全局命名空间污染
  2. 应用创建方式

    javascript复制代码

    javascript 复制代码
    // 示例1:通过全局对象
    Vue.createApp(...)
    
    // 示例2:直接使用导入的函数
    createApp(...)
  3. 开发体验差异

    • 示例 2 支持顶级 await 等现代 JS 特性
    • 示例 2 天然支持模块依赖管理
    • 示例 2 在控制台错误提示更清晰(含模块信息)
  4. 性能特点

    指标 示例 1 示例 2
    首次加载 立即执行 需解析模块依赖
    缓存效率 全局缓存 模块级缓存
    按需加载潜力 ❌ 全量加载 ✅ 理论可行 (需 CDN 支持)
  5. 生产环境建议

    • 示例 1 方式:适合嵌入第三方平台的简单组件
    • 示例 2 方式:适合 PWA/现代 Web 应用
    • 共同限制:对于复杂应用,两者都不如 Vite 构建方案
      • 缺少 HMR 热更新
      • 无代码分割优化
      • 无预处理器支持

为什么示例 2 更代表未来趋势?

  1. 符合 ESM 标准:浏览器原生模块支持已成为标准

  2. 更好的代码组织

    javascript复制代码

    javascript 复制代码
    // 可轻松扩展为
    import { createApp, ref } from 'vue'
    import router from './router.js'
  3. 与现代工具链兼容:可平滑迁移到 Vite 等构建工具

  4. 渐进式加载:为未来实现模块按需加载奠定基础

迁移建议:新项目优先使用示例 2 的方式,旧项目可逐步迁移。但最终复杂项目都应转向基于 Vite 的完整工程化方案。

相关推荐
Orange_sparkle12 小时前
dify的web页面如何传入user用户信息进行对话,而不是uuid
前端·人工智能
Amumu1213812 小时前
Vue Router 和 常用组件库
前端·javascript·vue.js
霍理迪12 小时前
CSS移动端开发及less使用方法
前端·css
2601_9498574312 小时前
Flutter for OpenHarmony Web开发助手App实战:HTML参考
前端·flutter·html
£漫步 云端彡12 小时前
Golang学习历程【第八篇 指针(pointer)】
javascript·学习·golang
爱内卷的学霸一枚12 小时前
现代前端工程化实践:从Vue到React的架构演进与性能优化(7000字深度解析)
前端·vue.js·react.js
南风知我意95712 小时前
【前端面试4】框架以及TS
前端·面试·职场和发展
鹏北海-RemHusband12 小时前
踩坑记录:iOS Safari 软键盘下的“幽灵弹窗“问题
前端·ios·safari
极客小云12 小时前
【基于AI的自动商品试用系统:不仅仅是虚拟试衣!】
javascript·python·django·flask·github·pyqt·fastapi
一位搞嵌入式的 genius12 小时前
深入理解浏览器中的 JavaScript:BOM、DOM、网络与性能优化
前端·javascript·网络·性能优化