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

一、当执行 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就是一个模块加载器,所有资源都可以作为模块来加载,最后打包输出

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es6 --- 用promise对象实现Ajax操作的一个实例

首先回顾一下Ajax请求的步骤 var client new XMLHttpRequest(); client.open("GET", url); client.onreadystatechange handler; client.responseType "json"; client.setRequestHeader("Accept", "application/json"); client.s…

Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini以及服务无法启动的解决办法以及修改初始密码的方法...

LZ初学SQL&#xff0c;本来以为开源的安装很简单&#xff0c;但是中间出现了一些问题&#xff0c;记录下来&#xff0c;希望能帮助到他人。 mysql官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/点击打开链接 以5.7.20版本为例 首先安装包解压后&#xff0c;没…

总结 构造函数与非构造函数 原型继承的一个方法

这两天真的一直在看原型以及继承之间的千丝万缕&#xff0c;哇&#xff0c;收获颇多&#xff0c;不过所谓温故知新&#xff0c;还是要多复习复习知识点&#xff0c;才能察觉那些之前不易发现的小小sparkle 真心推荐MDN文档——对象原型&#xff0c;JavaScript 中的继承&#x…

【深度学习】caffe 中的一些参数介绍

一个优秀的算法工程师51%的时间在调参数&#xff0c;48%的时间在测试模型&#xff0c;剩下的1%时间再写代码。段子虽然是网上看来的&#xff0c;但调参数是真的心碎。像我这样的小萌新更是觉得无从下手。只有知己知彼&#xff08;了解每个参数的含义&#xff09;&#xff0c;才…

Vue学习笔记(二)—— vue项目中使用axios

一、文档链接 axios文档 vue开发插件 二、axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端&#xff0c;它本身具有以下特征&#xff1a; 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支持 Promise API 拦截请求和响应 转换请求和响应…

es6 --- promise.prototype.then的链式引用

很多时候,我们需要使用ajax请求获取数据A.并使用A中的数据A.a来进行下一步的Ajax操作… 下面使用promise.prototype.then的链式引用来实现 // 首先封装一个getJSON的方法. var getJSON function (url) {var promise new Promise(function (resolve, reject) {var client ne…

jquery对json 键值对或数组的增加、删除、遍历操作

在前端遍历json键值对或数组遍历的情况也会经常用到&#xff0c;我们知道在java、c#其它的语言里提供方便的方法来操作&#xff0c;那么在json里面有没有类似的方法呢&#xff0c;废话就不多说了上代码&#xff1a;var jsonStr{}; //增加 jsonStr["name1"]"yu&q…

廖雪峰老师Git教程代码梳理

建立版本库 创建一个版本库非常简单&#xff0c;首先&#xff0c;选择一个合适的地方&#xff0c;创建一个空目录&#xff08;repository&#xff09;&#xff1a; $ mkdir learngit //创建learngit目录 $ cd learngit //切换当前目录为learngit目录 $ pwd //用于显示当…

BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】

2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 3446 Solved: 1692[Submit][Status][Discuss]Description 小Z是一个小有名气的钢琴家&#xff0c;最近C博士送给了小Z一架超级钢琴&#xff0c;小Z希望能够用这架钢琴创作出世界上最美妙的音乐。 这…

Vue项目代码改进(六)—— vue的mixins的使用

混入可以将不同组件的共同内容部分在一个混入对象中展示&#xff0c;然后通过在组件实例中混入这个对象&#xff0c;这样拥有这些属性的组件都可以调用 混入对象中的属性名跟组件中的属性名冲突时&#xff0c;以组件自身的为基准 举例&#xff1a;单文件组件users.vue 1&#x…

es6 --- Promise.catch

Promise.prototype.catch(): 是.then(null, rejection)的别名,用于指定发生错误时的回调函数 p.then( (val) -> console.log(fulfilled:, val)).catch( (err) > console.log(rejected, err));// 等同于 p.then( (val) > console.log(fulfilled:, val)).then(null, (e…

爬虫的一些工具(二)

爬虫的一些工具(二) 1. 常有的工具 (1). python(2). pycharm(3).浏览器i.chromeii.火狐(4).fiddler的使用2 fiddler的使用 (1).操作界面(2)界面含义请求(Request)部分详解名称含义Headers显示客户端发送到服务器的 HTTP 请求的,header 显示为一个分级视图&#xff0c;包含了 We…

微信开发者工具一打开代码编辑区文件全部不见了

今天开微信开发者工具时&#xff0c;一打开竟然文件全部不见了&#xff01;然后页面也编译不出来&#xff0c;搜了一下大神们的建议&#xff1a; 1、在编辑器控制台输入&#xff1a;openVendor 回车 会打开一个文件夹&#xff1a;C:\Users\Administrator\AppData\Local\微信we…

vue项目中所使用的element-UI / echarts

高清版思维导图见后台管理项目地址 1.login登录页面 < el-form >表单 在 Form 组件中&#xff0c;每一个表单域由一个 Form-Item 组件构成&#xff0c;表单域中可以放置各种类型的表单控件&#xff0c;包括 Input、Select、Checkbox、Radio、Switch、DatePicker、TimeP…

es6 --- 使用yield*命令遍历完全二叉树

首先定义二叉树的结构: // 定义二叉树的结构 function Tree(left, label, right) {this.left left;this.label label;this.right right; }// 对二叉树采用中序遍历 function* inorder(t) {if(t) {yield* inorder(t.left);yield t.label;yield* inorder(t.right);} }// 生成…

面向对象之继承与派生

阅读目录 一 初识继承二 继承与抽象&#xff08;先抽象再继承&#xff09;三 继承与重用性四 派生五 组合与重用性六 接口与归一化设计七 抽象类八 继承实现的原理&#xff08;可恶的菱形问题&#xff09;九 子类中调用父类的方法一 初识继承 什么是继承 继承是一种创建新类的方…

SpringBoot(十三)-- 不同环境下读取不同配置

一、场景&#xff1a; 在开发过程中 会使用 开发的一套数据库&#xff0c;测试的时候 又会使用测试的数据库&#xff0c;生产环境中 又会切换到生产环境中。常用的方式是 注释掉一些配置&#xff0c;然后释放一下配置。SpringBoot提供了在不同环境下切换不同配置的功能&#xf…

MDN文档基础知识搜集

Array数组&#xff0c;一种允许你存储多个值在一个引用里的结构。var myVariable [1,Bob,Steve,10]; 引用数组的元素只需&#xff1a;myVariable[0], myVariable[1], 等等. 发布工具: FTP 客户端 你还需要一种将文件从本地硬盘上传到远程Web服务器的方法。 为了做到这一点&am…

vue-cli生成项目时你应当知道的

一、安装 npm install -g vue-cli二、创建项目 vue init 模板名 项目名 vue init webpack mymall模板名: 1 . webpack 最常用 2 . webpack-simple // 一个简单webpackvue-loader的模板&#xff0c;不包含其他功能。 3 . browserify // 一个全面的Browserifyvueify 的模板&am…

es6 --- 正确获取Generator函数内部的this对象使其可以使用new

首先看2个例子 function * g() {this.a 11; }let o g(); console.log(o.a);可以看见Generator函数里面的this指向的对象取不出来. 再看下一个例子: function* F() {yield this.x 2;yield this.y 3; } new F();可以看出Generator函数无法使用new操作符, 下面一共一个解决…