一、当执行 import vue from ‘vue’ 时发生了什么?

其实在 node.js 中,执行 import 就相当于执行了 require,而 require 被调用,就会用到 require.resolve 这个函数来查找包的路径,而这个函数在 nodejs 中会有一个关于优先级的算法。

  1. import Vue from ‘vue’ 解析为 const Vue = require(‘vue’)。
  2. require 判断 vue 是否未 node.js 核心包,如我们常用的:path,fs 等,是则直接导入,否则继续往下走。
  3. vue 非 nodejs 核心包,判断 vue 是否未 ‘/’ 根目录开头,显然不是,继续往下走。
  4. vue 是否为 ‘./’、’/’ 或者 ‘…/’ 开头,显然不是,继续往下走。
  5. 以上条件都不符合,读取项目目录下 node_modules 包里的包。

如果写全的话是import vue from ‘…/node_modules/vue/list/vue.js’
这样写显然十分的不方便,此时在webpack.base.conf.js中进行了定义,内置了一些选项,extenions:[’.js’,’.vue’,’.json’],意思是省略后面的后缀,由webpack来自动为我们加上。
如果名字比较长,还可以起个别名。
alias:{
‘@’:resolve(‘src’), //它的意思是在vue项目中,引入路径的时候使用@即代表src文件夹,省去了…/…/…/的操作

到了第五步,import Vue from ‘vue’ 就找到了 vue 所在的实际位置了,那么问题来了,node_modules 下的 vue 是一个文件夹,而引入的 Vue 是一个javascript 对象,那它是怎么取到这个对象呢?

其实对于一个 npm 包,内部还有一个文件输出的规则,先看下 node_modules/vue 下的文件结构:
├── LICENSE
├── README.md
├── dist
├── package.json
├── src
└── types

对于 npm 包,require 的规则是这样的:

  1. 查找 package.json 下是否定义了main字段,是则读取 main 字段下定义的入口。
  2. 如果没有 package.json 文件,则读取文件夹下的 index.js 或者 index.node。
  3. 如果 package.json、index.js、index.node 都找不到,抛出错误 Error: Cannot find module ‘some-library’。

那么看一下 vue 的 package.json 文件有这么一句:
{

“main”: “dist/vue.runtime.common.js”,

}

  1. 因此:
    import vue from ‘vue’ 最后转换为
    const vue = require(’./node_modules/vue/dist/vue.runtime.common.js’)
    而 vue.runtime.common.js 文件的最后一行是:module.exports = Vue;,就正好跟我们平时使用时的 new Vue({}) 是一致的,这就是 import vue from ‘vue’ 的过程了。

二、 什么时候需要import Vue from ‘vue’

我认为,在使用vue-router、vuex这类vue核心插件前,要先导入vue,再安装。
因为Vue-router并没有将Vue打包进自己的插件,所以注册时使用的是外部Vue引入的方式。
待补充

src/router/index.jsimport Vue from 'vue'
import Router from 'vue-router'
src/plugins/http.jsimport axios from 'axios'

三、单文件组件

在很多 Vue 项目中,我们使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '}) 在每个页面内指定一个容器元素。

这种方式在很多中小规模的项目中运作的很好,在这些项目里 JavaScript 只被用来加强特定的视图。但当在更复杂的项目中,或者你的前端完全由 JavaScript 驱动的时候,下面这些缺点将变得非常明显:

全局定义 (Global definitions) 强制要求每个 component 中的命名不得重复
字符串模板 (String templates) 缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的
不支持 CSS (No CSS support) 意味着当 HTML 和 JavaScript 组件化时,CSS 明显被遗漏
没有构建步骤 (No build step) 限制只能使用 HTML 和 ES5 JavaScript, 而不能使用预处理器,如 Pug (formerly Jade) 和 Babel

文件扩展名为 .vue 的 single-file components(单文件组件) 为以上所有问题提供了解决方法,并且还可以使用 webpack 或 Browserify 等构建工具。
vue单文件组件

1、 '.vue '文件

.vue文件,称为单文件组件,是Vue.js自定义的一种文件格式,一个.vue文件就是一个单独的组件,在文件内封装了组件相关的代码:html、css、js

.vue文件由三部分组成:<template>、<style>、<script><template>html</template><style>css</style><script>js</script>

2、 vue-loader

浏览器必须对.vue文件进行加载解析,此时需要vue-loader
类似的loader还有许多,如:html-loader、css-loader、style-loader、babel-loader等
需要注意的是vue-loader是基于webpack的

3、 webpack

webpack是一个前端资源模板化加载器和打包工具,它能够把各种资源都作为模块来使用和处理
实际上,webpack是通过不同的loader将这些资源加载后打包,然后输出打包后文件
简单来说,webpack就是一个模块加载器,所有资源都可以作为模块来加载,最后打包输出

梳理得太乱了,我也不造自己要说啥

Vue学习笔记(一)—— 什么时候需要import Vue from 'vue'相关推荐

  1. day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法

    系列文章目录 day1学习vue2笔记 vue指令 day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios day3 vue2 学习笔记 vue组件 day4 vue 学习笔记 组件 生命 ...

  2. Vue学习笔记(5)(Vuex)

    Vue2.x学习笔记.原视频教程:最全最新Vue.Vuejs教程,从入门到精通_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili Vuex 认识Vuex 官方解释:Vuex 是一个专为 Vue.js ...

  3. Vue学习笔记(4)(Vue-router)

    Vue2.x学习笔记.原视频教程:最全最新Vue.Vuejs教程,从入门到精通_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili Vue-router 0. 认识路由 什么是路由? 路由是一个网络工 ...

  4. Vue学习笔记(五)—— 状态管理Vuex

    介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试 ...

  5. VUE学习笔记------奕长苏

    VUE学习笔记------奕长苏 一.引言 二.视图和数据的双向绑定 - - - v-model 三.组件 - - - component 四.其它 一.引言 本文为个人在学习vue时总结的学习笔记, ...

  6. Vue学习笔记(三)Vue2三种slot插槽的概念与运用 | ES6 对象的解构赋值 | 基于Vue2使用axios发送请求实现GitHub案例 | 浏览器跨域问题与解决

    文章目录 一.参考资料 二.运行环境 三.Vue2插槽 3.1 默认插槽 3.2 具名插槽 3.3 作用域插槽 ES6解构赋值概念 & 作用域插槽的解构赋值 3.4 动态插槽名 四.GitHu ...

  7. 「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析

    「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析 前言 一.我的开发环境 二.使用 Vue CLI (Vue 脚手架)快速搭建项目 三.初始项目的目录结构 ...

  8. Vue学习笔记(十一)

    1.Vue学习笔记(十一) 文章目录 1.Vue学习笔记(十一) 1.1Vue_配置代理_方式 1.1.0演示问题 1.1.1运行node server1 1.1.2运行node server2 1. ...

  9. Vue学习笔记: Vue + Element-ui搭建后台管理系统模板

    Vue学习笔记: Vue + Element-ui搭建后台管理系统模板 技术:Vue + Element-ui 功能:后台管理系统基础模板,路由配置,加载页面进度条,请求响应拦截器的封装等 页面预览: ...

  10. vue-resource post php,Vue学习笔记进阶篇——vue-resource安装及使用

    简介 vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应.也就是说,$.ajax能做的事情,vue-resource插件一样也能做到 ...

最新文章

  1. python基础知识整理 第三节 :函数
  2. C#中的Dictionary简介
  3. php的$_SERVER['HOSTNAME']
  4. hdu1816 + POJ 2723开锁(二分+2sat)
  5. 八、TFTP服务器搭建及应用
  6. 下拉框--请选择-- 浏览器渲染不同造成页面初始化不一致
  7. 【月薪三万】听说深圳老师工资全国最高!!!比德国还高
  8. java downloadfile_FileDownload.java:文件下载工具类
  9. chown r mysql var_Mysql 常用命令
  10. python判断给定的手机号是否存在
  11. Qt日历控件显示周数为:日一二三四五六
  12. 140个电脑小知识、小技巧
  13. 人工智能ai技术案例_AI在软件测试中的案例
  14. 一文解析TCP知识体系
  15. 如何在手机设置中打开位置定位服务器,手机gps定位功能如何设置
  16. Firefox主页被360篡改该怎么办
  17. 计算机毕设 SpringBoot 校园志愿者管理系统 志愿者管理系统 志愿者信息管理系统Java Vue MySQL数据库 远程调试 代码讲解
  18. 万年历黄历星座查询v3.6.7
  19. 1.居民身份证号码,由17位数字本体码,和1位数字校验码组成 2.判断用户输入的身份证号码是否合法 规则为:号码为18位,不能以0开头,前17位只可以是数字,最后一位可以是数字或‘X‘
  20. 报表数据源之JSON

热门文章

  1. golang 捕获堆栈信息_【网络数据安全】为什么时间戳对于数据包捕获很重要
  2. xshell搭建宝塔没有远程命令密码框框弹出来_服务器安装宝塔控制面板+wordpress搭建个人网站...
  3. python visa模块_已经安装了pyvisa仍然报错没有模块
  4. ajax刷新iframe页面,通过iframe实现简单的ajax表单提交
  5. 通俗讲解:图像傅里叶变换
  6. 《学习之道》第九章不要突击工作
  7. MUI主界面菜单同时移动主体部分不出滚动条解决
  8. Six Basic Functional Areas of Spring
  9. java环境变量设置与java查看安装路径
  10. .NET开发过程中的全文索引使用技巧之Solr