當執行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 bson import ObjectIdImportObject
- from selenium import webdriverImportWeb
- python from import 出錯PythonImport
- Python import相關內容區別介紹( import *** as 、from***import )PythonImport
- 徹底搞懂Python 中的 import 與 from importPythonImport
- win10 vscode 快速修復 沒有Update import from "Vue"Win10VSCodeImportVue
- 當執行時,發生了什麼?
- Export/import Datas To/from a Csv FileExportImport
- python基礎--自定義模組、import、from......import......PythonImport
- cannot import name ‘multiarray‘ from ‘numpy.core‘Import
- ImportError: cannot import name ‘BaseQuery‘ from ‘flask_sqlalchemy‘ImportErrorFlaskSQL
- 解決 ImportError: cannot import name 'imread' from 'scipy.misc'ImportError
- new Vue發生了什麼Vue
- 啟動vue專案時發生了什麼Vue
- ImportError: cannot import name 'get_ora_doc' from partially initialized moduleImportErrorZed
- Vue Router Cannot find module 'XXX.vue'Vue
- vue Cannot find module @/xxx/xxx.ts or its corresponding typeVue
- 當我們的執行 java -jar xxx.jar 的時候底層到底做了什麼?JavaJAR
- TypeError: Cannot read private member xxx from an object whose class did not declare itErrorObject
- 【問題解決】java.sql.SQLException: null, message from server: “Host ‘xxx.xx.xx.xxx‘ is blocked because ofJavaSQLExceptionNullServerBloC
- python3 筆記17.呼叫模組from...import...Python筆記Import
- Vue原始碼探祕(三)(new Vue發生了什麼?)Vue原始碼
- Vue系列-import動態引入的坑VueImport
- const {xxx} = this 是什麼?
- 「試著讀讀 Vue 原始碼」new Vue()發生了什麼 ❓Vue原始碼
- 為什麼defineProps宏函式不需要從vue中import匯入?函式VueImport
- 2024-07-17 xxx.vue?raw作用 ==> 把xxx.vue轉換成原始碼,以字串形式返回Vue原始碼字串
- Vue .sync修飾符與$emit(update:xxx)VueMIT
- 區分import 什麼時候使用 花括號{ }Import
- JS每日一題:new Vue()中發生了什麼?JS每日一題Vue
- could not connect to redis Instance at xxx.xxx.xxx.xxx:6379Redis
- Linux虛擬機器配置IP時提示:determining ip information for ip xxx.xxx.xxx.xxx address is alreadyLinux虛擬機ORM
- 當 Redis 發生高延遲時,到底發生了什麼Redis
- vue 踩坑記錄 cannot read property xxx of undefinedVueUndefined
- vue原始碼解析之npm run build發生了什麼?Vue原始碼NPMUI
- C++ vector<std::tuple<XXX, XXX, XXX>>C++
- 使用新版flask-script時報錯No module named flask._compat和cannot import name ‘_request_ctx_stack‘ from ‘flask‘FlaskImport
- [譯] 當你建立 Flexbox 佈局時,都發生了什麼?Flex