當執行import vue from ‘vue‘ 或其它import xxx from ‘xxx‘ 時發生了什麼?
使用vue.js開發專案是,要用到
import Vue from 'vue'
import App from './App';
import router from './router';
上面的程式碼等同於:
import Vue from "../node_modules/vue/dist/vue.js";
import App from './App.vue';
import router from './router/index.js';
優先順序的演算法
在 nodejs 中,執行 import 就相當於執行了 require,而 require 被呼叫會用到 require.resolve 這個函式來查詢包的路徑,這個函式在 nodejs 中會有一個關於優先順序的演算法。
那 import Vue from ‘vue’ 這一句做了什麼呢?
- import Vue from ‘vue’ 解析為 const Vue = require(‘vue’)。
- require 判斷 vue 是否未 node.js 核心包,如我們常用的:path,fs 等,是則直接匯入,否則繼續往下走。
- vue 非 nodejs 核心包,判斷 vue 是否未 ‘/’ 根目錄開頭,顯然不是,繼續往下走。
- vue 是否為 ‘./’、’/’ 或者 ‘…/’ 開頭,顯然不是,繼續往下走。
- 以上條件都不符合,讀取專案目錄下 node_modules 包裡的包。
- 到此為止,import Vue from 'vue’這一句 就找到了 vue 所在的實際位置了。
但是,在node_modules 下的 vue 是一個資料夾,而引入的 Vue 是一個 javascript 物件,那它是怎麼取到這個物件呢?
事實上,對於一個 npm 包,內部還有一個檔案輸出的規則,下圖為 node_modules 下的 vue 結構
vue.js 在 dist 資料夾中
- 查詢 package.json 下是否定義了 main 欄位,是則讀取 main 欄位下定義的入口。
- 如果沒有 package.json 檔案,則讀取資料夾下的 index.js 或者 index.node。
- 如果都 package.json、index.js、index.node 都找不到,丟擲錯誤 Error: Cannot find module ‘some-library’。
在 vue 的 package.json 檔案有這麼一句:
"main": "dist/vue.runtime.common.js"
因此,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引入的方式。
小結
1.import…from…的from命令後面可以跟很多路徑格式,若只給出vue,axios這樣的包名,則會自動到node_modules中載入;若給出相對路徑及檔案字首,則到指定位置尋找。
2.可以載入各種各樣的檔案:.js、.vue、.less等等。
3.可以省略掉from直接引入。
相關文章
- from ... import ... 執行機制Import
- 當執行時,發生了什麼?
- from module import 和 import 的區別Import
- import tkinter與from tkinter import *的區別Import
- from selenium import webdriverImportWeb
- from bson import ObjectIdImportObject
- Export/import Datas To/from a Csv FileExportImport
- python from import 出錯PythonImport
- Python import相關內容區別介紹( import *** as 、from***import )PythonImport
- python基礎--自定義模組、import、from......import......PythonImport
- 徹底搞懂Python 中的 import 與 from importPythonImport
- win10 vscode 快速修復 沒有Update import from "Vue"Win10VSCodeImportVue
- cannot import name ‘multiarray‘ from ‘numpy.core‘Import
- new Vue發生了什麼Vue
- "_OBJC_CLASS_$_XXX", referenced from:OBJ
- 啟動vue專案時發生了什麼Vue
- ImportError: cannot import name ‘BaseQuery‘ from ‘flask_sqlalchemy‘ImportErrorFlaskSQL
- import reload from...reload的區別Import
- python中from module import * 的一個陷阱PythonImport
- Import Data From MS Excel to DataSet without using COM ObjectsImportExcelObject
- Vue原始碼探祕(三)(new Vue發生了什麼?)Vue原始碼
- 解決 ImportError: cannot import name 'imread' from 'scipy.misc'ImportError
- ImportError: cannot import name 'get_ora_doc' from partially initialized moduleImportErrorZed
- 「試著讀讀 Vue 原始碼」new Vue()發生了什麼 ❓Vue原始碼
- 當主執行緒崩潰而其它執行緒繼續執行時發生什麼(2)(轉)執行緒
- 當主執行緒崩潰而其它執行緒繼續執行時發生什麼(1)(轉)執行緒
- Oracle 表 XXXXX 發生了變化, 觸發器/函式不能讀它.Oracle觸發器函式
- Vue Router Cannot find module 'XXX.vue'Vue
- 當我們的執行 java -jar xxx.jar 的時候底層到底做了什麼?JavaJAR
- python3 筆記17.呼叫模組from...import...Python筆記Import
- from skimage.restoration import denoise_tv_chambolle 出現錯誤RESTImport
- Vue系列-import動態引入的坑VueImport
- JS每日一題:new Vue()中發生了什麼?JS每日一題Vue
- The type XXX cannot be resolved.It is indirectly referenced from required .classUI
- 當 Redis 發生高延遲時,到底發生了什麼Redis
- 為什麼defineProps宏函式不需要從vue中import匯入?函式VueImport
- vue原始碼解析之npm run build發生了什麼?Vue原始碼NPMUI
- 區分import 什麼時候使用 花括號{ }Import