- 蘇格團隊
- 做者:Luis
通過近幾年的沉澱,前端屆的變革在現階段總算是進入了一個平穩期。回顧一下前人走過的路,主要是在解決如下問題:javascript
爲了解決這些問題,出現瞭如下解決方案:css
這些解決方法成爲了咱們開發中不可或缺的功能,因而咱們須要一個工具把這些聯立起來,因而先後出現像grunt、gulp、fis、webpack等前端工程化構建工具。通過一段時間的更新迭代後,webpack以萬物皆模塊的思想以及功能強大,漸漸在衆多工具中脫穎而出,成爲前端項目中經常使用的構建工具。html
在現階段,我的以爲前端項目構建愈來愈重、愈來愈繁瑣了。對於一個新的項目,老是須要安裝一堆的依賴(幾百M的node_modules),而後寫一堆構建工具的配置項,最後才能進行業務開發。當項目愈來愈大的時候,每次啓動時都須要花費很多時間。由於構建工具須要對項目進行依賴分析、編譯,最後才能輸出瀏覽器能執行的文件。這時構建工具配置的優化又提上你們的工做日程。前端
目前構建優化的方案,以webpack爲例,主要有如下幾個方向:vue
可是業務代碼到達必定程度(5W行以上),作了上述的優化後,速度確實加快了很多,可是我的感受對於dev(開發環境)仍然有些沉重。java
在某次看到@vue/dev-server這個工具後,忽然間靈光一閃,想到了一個可行性的方案。這個工具只用一行命令就能夠快速的啓動一個.vue
單文件的開發環境,咱們先來看看它作了什麼處理。node
按照文檔創建的的文件,沒有webpack.config之類的配置,也沒有預處理輸出的文件。webpack
index.html 文件,利用目前最新chrome瀏覽器支持的es module加載main.js。git
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue dev</title>
</head>
<body>
<div id="app"></div>
<script type="module">
import './main.js'
</script>
</body>
</html>
複製代碼
main.js文件,引入test.vue文件,跟日常項目的入口文件同樣。test.vue文件內代碼就是日常vue單文件的格式,不展現了。github
import Vue from 'vue'
import App from './test.vue'
new Vue({
render: h => h(App)
}).$mount('#app')
複製代碼
接着來看看瀏覽器加載的資源,路徑跟import保持一致,類型都是script(Content-Type: application/javascript)。
main.js中,import Vue from 'vue'
被處理成import Vue from '/__modules/vue'
。由於瀏覽器的es module還未實現仍在提案的import-maps特性,因此不支持不帶路徑的依賴。vue就是瀏覽器能執行的vue.js。
test.vue就是源文件進行編譯以後的代碼,由於本來的.vue
單文件瀏覽器是不支持的,須要進行預編譯。
因而可知,該工具重點在於利用中間件,作了如下處理:
.vue
文件,轉換成瀏覽器支持的js,相似於webpack中的vue-loader仔細思考一下,目前的構建工具都是對項目所依賴的資源文件進行全量的處理,但不少時候,咱們只是對於某個頁面中的某個模塊進行開發。從理想的角度出發,其實咱們只須要對該頁面依賴的資源文件進行處理。每當加載瀏覽器不能執行的資源:vue、sass、less等,才進行轉譯/編譯處理,最後輸出資源文件到瀏覽器。
實際上社區也有人在作相似的嘗試,好比:systemjs,github描述是:Dynamic ES module loader
。固然這不僅是爲了在瀏覽器端兼容es module,重點在於其實現的Transform loader
功能。該功能提供相似於webpack loader的功能,對於匹配的依賴進行相對應的loader處理。具體loader處理能夠放到web worker或者經過node server進行處理,若是能兼容大部分webpack loader卻是一個不錯的方案。
目前該想法還有待驗證與實現,有興趣的可去了解一下相關的內容,如有進一步的研究,也但願能一塊兒交流討論。