import Vue from 'vue' 發生了什么


import Vue from 'vue' 發生了什么

使用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 文件夾中

對於 npm 包,require 的規則是這樣的:

  • 查找 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直接引入。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM