热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue运行时全解析Vue的引入(二)

VueRuntimeFullAnalysis-ImportVueModule回顾系列文章之《VueCLI3上手》上一节《Vue运行时全解析-VueCLI3上手(一&#
Vue Runtime Full Analysis - Import Vue Module

回顾系列文章之《VueCLI3上手》

上一节 《Vue运行时全解析 - VueCLI3上手(一)》中介绍了VueCLI3的一些信息,包括以下几点:

  • 官方主推VueCLI3的原因
  • CLI3的核心概念
  • CLI3的安装
  • CLI3简单创建一个项目
  • Vue ui的使用介绍
  • 使用CLI3按照旧版方式创建项目的方法
  • 安装插件vuex,router方法
  • 修改项目配置的方式
  • 使用VueCLI3的serve命令 打开一个vue文件

阅读本节你能学到什么?

  • 查看项目的配置文件的2种方法

    • vue inspect 命令方式
    • vue ui 可视化方式
  • 在脚手架项目中引入vue的方式

    • 脚手架项目入口文件的位置
    • Webpack 引入模块的机制
    • vue 编译后的文件的用途
  • 引入的vue做了哪些前置工作

导出配置文件

开始分析之前,我们先把项目配置文件先导出来,以做分析备用,在VueCLI3配置的文档中可以找到俩中方式找到配置内容:

  • inspect命令:通过下面命令将项目的默认配置导出到文件中,这里命名为preset-default-vue-cli-3.js

    yanyue$ vue inspect > preset-default-vue-cli-3.js

  • vue ui 的inspect面板,点击运行可以获取到。

    可以通过 vue ui 启动可视化配置界面 如下图,在这里可以看到 task(任务) 面板,task面板有4个task, 选择 inspect 面板能够看到 run(运行按钮) ,点击后,便能够查看到输出的配置信息,在这里查看到的是文本方式查看,由于内容较多,像我这次要分析,需要折叠代码看到这个配置的整体信息,一般情况,我们不会所有配置都去修改,在这里查阅非常方便,而且运行一次,下次切换过来这个内容还在。

    就仅仅配置文件足有1000+行... 从这里看vue也是花了大功夫把各种工具的配置文件都进行了优化整合,并提供统一的修改方式,之后我们会讲到如何在项目中修改配置。

clipboard.png

项目引入vue的方式

要知道项目是怎么引入vue框架的,我们先从最开始了解一下的程序入口main.js文件,因为vue的引入时在这个文件中,那我们先看看这个文件被引入的过程是怎么工作的?

main.js

src/main.js是整个程序的入口文件,在上面导出的配置文件中我们搜索entry这个关键字,可以看到下图的配置信息:

entry: {app: ['./src/main.js']
}

VueCLI3项目的入口文件就是通过该配置字段来定义输入给 webpack 的,最后通过 HtmlWebpackPlugin 插件将打包好的脚本注入进根据public中的index.html模板生成的新的html文件中, 如下面配置中插件中的template选项:

new HtmlWebpackPlugin({templateParameters: function () { /* omitted long function */ },template: 'path/to/project-root/public/index.html'
})

将vue引入项目

第一行代码

import Vue from 'vue'

使用了ES2015的语法将vue的运行时作为依赖模块引入程序。

我们关注一下模块细节

使用VueCLI3安装的项目,项目的基本依赖(包括babel, vue等)已经被安装好了,我们去node_modules目录中找到vue模块目录,从目录下package.json文件能够看到如下图:

clipboard.png

从图中能看到 vue对多种引入方式以不同文件提供支持,包括符合CommonJS模块规范的 vue.runtime.common.js 、符合ES Module模块规范的vue.runtime.esm.js和符合UMD模块规范的 vue.js以及支持TypeScript的类型定义文件index.d.ts

我们的项目使用webpack打包各个模块,webpack优先会选取ES模块方式引入包(原因:webpack中的处理 参考:roollup相关的解释)

在web环境中,webpack会依据resolve下的mainFields字段中配置的属性所指定的位置读取文件,而当前版本的vue项目配置中配置了pkg.module和pkg.main这俩个位置,所以webpack优先读取了module指向的dist/vue.runtime.esm.js文件,忽略了pkg.main字段指向的位置文件。

编译后的文件

上面说到了vue.runtime.esm.js这个文件被webpack作为vue项目提供的vue模块引入到我们的项目中,但是从安装的vue模块目录的dist下却发现了好几个文件,如下图:

clipboard.png

以下大多参考官方文档内容,并做了简单解释性翻译:

解释编译后的文件

Explanation of Build Files

UMDCommonJSES Module
Fullvue.jsvue.common.jsvue.esm.js
Runtime-onlyvue.runtime.jsvue.runtime.common.jsvue.runtime.esm.js
Full (production)vue.min.js
Runtime-only (production)vue.runtime.min.js

名词解释(Terms)

  • Full: builds that contains both the compiler and the runtime.

    • 完整版,包含 compiler 和 runtime
  • Compiler: code that is responsible for compiling template strings into Javascript render functions.

    • Compiler : 负责将模板字符串编译成render函数
    • 注意: 请留意后面会讲到的render函数
  • Runtime: code that is responsible for creating Vue instances, rendering and patching virtual DOM, etc. Basically everything minus the compiler.

    • runtime: 负责创建vue实例, 渲染和调整虚拟DOM等,基本上等效于除去compiler的所有一切。
  • UMD: UMD builds can be used directly in the browser via a tag. The default file from Unpkg CDN at https://unpkg.com/vue is the Runtime + Compiler UMD build (vue.js).

    • UMD文件可以使用script标签直接引入html文件,默认从Unpkg CDN获取的文件就是 Runtime + Compiler版本的vue.js文件
  • CommonJS: CommonJS builds are intended for use with older bundlers like browserify or webpack 1. The default file for these bundlers (pkg.main) is the Runtime only CommonJS build (vue.runtime.common.js).

    • CommonJS版本为了那些还在使用browserify和webpack1的bundler提供的,默认main入口提供了仅包含Runtime的符合CommonJS规范的版本
  • ES Module: ES module builds are intended for use with modern bundlers like webpack 2 or rollup. The default file for these bundlers (pkg.module) is the Runtime only ES Module build (vue.runtime.esm.js).

    • ES模块版本是为了那些现代打包工具像 webpack2+ 或者 rollup,默认module入口提供了仅包含Runtime的符合ES Module规范的版本。

运行时 + 编译器 与 仅有编译器 的比较

Runtime + Compiler vs. Runtime-only

If you need to compile templates on the fly (e.g. passing a string to the template option, or mounting to an element using its in-DOM HTML as the template), you will need the compiler and thus the full build.

如果你需要在运行时处理之前编译templates(例如, 有一个template选项,或者挂载到一个元素上,而你又将元素内的DOM元素作为模板来处理,这时候就需要编译器这部分进行完整编译。

When using vue-loader or vueify, templates inside *.vue files are compiled into Javascript at build time. You don't really need the compiler in the final bundle, and can therefore use the runtime-only build.

如果你打包的时候是用vue-loader 或者 vueify,将`*.vue文件内的templates编译成Javascript代码, 你就不需要compiler, 可以使用 runtime-only版本编译。

Since the runtime-only builds are roughly 30% lighter-weight than their full-build counterparts, you should use it whenever you can. If you wish to use the full build instead, you need to configure an alias in your bundler.

因为仅仅包含运行时编译比完整版少30%的代码体积, 如果你需要使用完整包也是可以的,你需要调整配置。

显式的改变运行时引用包

Webpack

module.exports = {// ...resolve: {alias: {'vue$': 'vue/dist/vue.esm.js' // 'vue/dist/vue.common.js' for webpack 1}}
}

Rollup

const alias = require('rollup-plugin-alias')rollup({// ...plugins: [alias({'vue': 'vue/dist/vue.esm.js'})]
})

Browserify

Add to your project's package.json:

{// ..."browser": {"vue": "vue/dist/vue.common.js"}
}

vue模块在引入时做了什么?

看完了这几个文件的用途之后我们再来看看vue引入的时候做了什么? 带着这个疑问我们继续探索。

我们打开vue.runtime.js文件,文件内容有些多,我们先不关注这些细节,我们先看有哪几大块功能?

  • 工厂函数,支持不同规范的方式导出文件

    clipboard.png

  • 类型检测定义

    clipboard.png

  • 浏览器环境检测 Browser environment sniffing

    clipboard.png

  • 虚拟DOM的实现定义
  • globals MessageChannel
  • 初始化数据方法定义

    • initState
    • initProps
    • initData
    • initComputed
    • initMethods
    • initWatch
    • initRender
    • initMixin
  • 初始化调用

    • initMixin(Vue);
    • stateMixin(Vue);
    • eventsMixin(Vue);
    • lifecycleMixin(Vue);
    • renderMixin(Vue);
  • 这一步vue做了很多的前期准备工作,我们在后面章节还会细化...

本节结束

这一节我们只关注最基础的这一块,下一节,我们将继续关注细节。



推荐阅读
  • 本文详细介绍了在 Vue.js 前端框架中集成 vue-i18n 插件以实现多语言支持的方法。通过具体的配置步骤和示例代码,帮助开发者快速掌握如何在项目中实现国际化功能,提升用户体验。同时,文章还探讨了常见的多语言切换问题及解决方案,为开发人员提供了实用的参考。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 深入理解Java中的多态性概念及其应用
    多态是面向对象编程中的三大核心特性之一,与封装和继承共同构成了面向对象的基础。多态使得代码更加灵活和可扩展,封装和继承则为其提供了必要的支持。本文将深入探讨多态的概念及其在Java中的具体应用,帮助读者全面理解和掌握这一关键知识点。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
author-avatar
手机用户2602883205_410
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有