【Vue2.x源码学习】第一篇 - 使用 rollup 构建 Vue 环境

653 阅读5分钟

这是我参与更文挑战的第1天,活动详情查看: 更文挑战

一,前言

掘金的伙伴们大家好,前段时间参加了作者招募,迁移了10多篇水文到掘金

工作繁忙很久不写了,这次尝试参加更文挑战,希望能够坚持下来找找写东西感觉

以目前的时间其实很难写出对大家有价值的内容,这也是一年多没写东西的原因之一

写一篇好文章很难:从选题、定纲,到提出问题、思路方案,再到图文动画排版等等

所以,本着“时间有限可以少写”的原则,尝试对 vue2.x 源码学习过程进行简单梳理

每篇文章的篇幅可能不会很长,但会争取聚焦在一个点上把事情讲明白

之后应该会创建一个专栏:《vue2.x 源码学习笔记》(更新:已经创建好了)

希望可以将知识点拆碎,把问题来龙去脉讲清楚,毕竟看得懂才是最重要的

自己先学会,有输出;别人能看懂,有收获;说明才是真的会了;

所以,文章有没有赞无所谓,欢迎大家多提宝贵建议,感谢!

首篇:使用 Rollup 完成 Vue 源码环境的搭建


  • 20210902 20230106 更新:《vue2.x 源码学习笔记》第二轮前言

目前为止,已经参加并完成了 2 次掘金的更文挑战活动,感谢掘金提供的活动奖品,整个过程也让我收获了很多,养成了每天坚持学习和写作的好习惯;

接下来,开始对 《vue2.x 源码学习笔记》专栏进行持续改进:

  • 由于之前日更原因,很多内容没有进一步展开;
  • 语言组织和描述不够准确,排版凌乱,阅读体验不佳;
  • 缺少必要的示例、截图、流程图和动画来辅助理解;
  • 刻意练习;持续完善、改进、扩充此专栏;
  • 希望借此机会加深对 Vue 源码的理解;

完成了第一轮,仅仅是一个开始;

第二轮主要针对文章内容进行完善:不会做大量扩充,内容会适当的合并;

同时,也会跟着文章从头做一次,发现文章中存在的问题,并按章节附上源码;

感谢大家的留言和关注,近期工作比较忙,看到就会回复;


二,使用 Rollup 搭建 Vue2.x 源码环境

1,源码工程的初始化

npm init -y

// package.json
{
  "name": "source-learning-vue",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

2,安装 Rollup 打包依赖

开发环境依赖:

// 1,安装 rollup:用于 Vue 源码的打包构建
npm install rollup

// 2,使用 babel:需要安装核心模块 @babel/core;
npm install @babel/core

// 3,rollup 与 babel 关联
npm install rollup-plugin-babel

// 4,浏览器兼容:将 ES6 语法转译为 ES5
npm install @babel/preset-env


// ==> 合并写法:一次性安装开发环境所需的全部依赖
npm install rollup @babel/core rollup-plugin-babel @babel/preset-env -D

3,创建 Vue.js 入口文件

创建打包入口:src/index.js

// src/index.js Vue 构造函数
function Vue(){

}

// 导出 Vue 函数,提供外部使用
export default Vue;

4,创建 Rollup 配置文件

rollup 默认配置文件:项目根目录下rollup.config.js文件

创建 rollup.config.js,完成 rollup、babel 相关配置:

// src/rollup.config.js
import babel from 'rollup-plugin-babel'

// 导出 rollup 配置对象
export default {
    input:'./src/index.js',   // 打包入口
    output:{                  // 打包出口:可定义为数组,输出多种构件
        file:'dist/vue.js',   // 打包输出文件
        format:'umd',         // 打包格式(可选项):iife(立即执行函数)、esm(ES6 模块)、cjs(Node 规范)、umd(支持 amd + cjs)
        name:'Vue',           // 使用 umd 打包需要指定导出的模块名,Vue 模块将会绑定到 window 上;
        sourcemap:true,       // 开启 sourcemap 源码映射,打包时会生成 .map 文件;作用:浏览器调试ES5代码时,可定位到ES6源代码所在行;
    },
    // 使用 Rollup 插件转译代码
    plugins:[
        babel({
            // 忽略 node_modules 目录下所有文件(**:所有文件夹下的所有文件)
            exclude:'node_modules/**' 
        })
    ]
}

5,创建 rollup 构建脚本

执行 Rollup 打包构建 Vue,创建 rollup-script 构建脚本:

// package.json
{
  "name": "source-learning-vue",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "rollup -c -w"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.14.2",
    "@babel/preset-env": "^7.14.2",
    "rollup": "^2.47.0",
    "rollup-plugin-babel": "^4.4.0"
  }
}

dev 脚本解释:

  • rollup 命令:默认会去找 node_module/bin/rollup;
  • -c:config 选项,使用配置文件,默认找 rollup.config.js;
  • -w:watch 选项,监听文件变化;当文件发生变化时重新打包;

6,打包构建 Vue

执行构建脚本npm run dev image.pngsrc/index.js 输出至 dist/vue.js:

(其中,vue.js.map 为 sourcemap 源码映射文件) image.png

查看输出文件 dist/vue.js

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Vue = factory());
}(this, (function () { 'use strict'; // 此处 this 为 window

  function Vue() {} 

  return Vue; // 最终会导出 Vue 函数

})));

//# sourceMappingURL=vue.js.map

7,创建 Html 引入 Vue

(在 dist 目录下)创建 dist/index.html 引入 dist/vue.js,打印输出 Vue:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <!-- 引入 vue.js,将会绑定到 window-->
  <script src="./vue.js"></script>
  <script>
    console.log(Vue) 
  </script>
</body>
</html>

查看控制台输出,打印出 Vue 函数,说明 Vue 打包构建成功


三,结尾

本篇,配置 rollup 完成 Vue 源码环境搭建,主要涉及以下几点:

  • 工程初始化、依赖安装;
  • 创建 vue 入口文件、Rollup 配置文件、构建脚本;
  • 构建 Vue,创建 html 引入 vue.js,测试源码环境;

下一篇,Vue 的初始化流程;


维护日志

  • 20210603:首次发布
  • 20210604:添加文章封面、主题、前言、代码优化、关联专栏 TODO:添加截图、代码视觉调整、模块化介绍、 分析打包后global.Vue
  • 20210902:更新第二轮前言
  • 20210921:修复若川提出的错别字,感谢若川~
  • 20211202:微调部分描述、排版、添加部分注释;
  • 20230106: 修改代码注释、补充因果说明、添加配图、使内容表达更清晰;