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.pswp.cn/news/251397.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251397.shtml
英文地址,請注明出處:http://en.pswp.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操作符, 下面一共一個解決…