vite, 法語詞, 快的意思. 讀音爲 /vit/css
先來看看以前的先驅: parcel, rollup, webpack.這些工具的目的即是爲了打包, 爲了前端能有模塊化. 爲了前端能承擔更復雜的邏輯, 不被後端瞧不起.爲了證實js是宇宙第一的語言, 爲了.... 簡單總結下:html
import()
來實現的, 該函數返回一個promise
rollup-plugin-server
和 rollup-plugin-livereload
webpack-dev-server
便可, 就自定義性來講(配置鉤子, 中間件), webpack碾壓其他兩個rollup-plugin-hotreload
插件總結來講 若是是一個demo或者功能是可預期的簡單(不是產品說的那種), 使用parcel 若是是最小化的第三方導入的一個庫, 使用rollup 其他的使用webpack前端
說了一堆沒用的vue
前端老是有更多更大的輪子被創造出來, 挺好, 百花齊放, 百家爭鳴, 百舸爭流, 百依百順. 大佬老是很閒, 沒法理解底層搬磚的辛苦, 尤大在vue3.0時着重提了一把, 既然輪子都到眼前了,仍是掄一掄.node
首先看看vite的描述 開發環境下使用原生esm,生產環境使用Rollup打包 的一個網頁開發構建工具 很天然繼承了兩者的優勢:react
esm的優勢webpack
Rollup的優勢git
esm是基於瀏覽器的實現的,固然該標準在ES6中已經提出,兼容性請參考 mdn, 這裏僅僅簡單的提幾點:es6
test.mjsgithub
export const test = () => {
console.log('test')
}
複製代碼
index.js
import { test } from "./test.mjs";
test()
複製代碼
index.html
<script src="./index.js" type="module"></script>
複製代碼
上述代碼不須要通過任何的babel或webpack,直接能夠被瀏覽器運行並打印test
mjs
與js
都可, 只是mdn官方推薦使用js先, 由於不少服務器的content-type
不認識mjs
, 會致使解析出錯.因此沿用js
便可btn.addEventListener('click', () => {
import('./someDynamicModule').then(module => {
// handleModule
})
})
複製代碼
與webpack的比較:
<script type="module">
來實例化他們, 每個的導入都是一個HTTP請求.這樣的好處是什麼呢?
第三點我想着重說一下, webpack的HMR之因此須要設置module.accept就是但願開發者能在真的須要熱更新的地方使用, 由於一旦監聽, 就會監聽這個模塊以及這個模塊關聯的全部依賴的變化, 這是比較消耗資源的, 並且一旦發現變化會將整個模塊以及關聯的模塊都從新編譯一次. 那麼你說是否是很耗時間和性能?若是能夠對每一個單獨的模塊進行監聽和重編譯, 是否是美滋滋?
不過也不是沒有缺點
<script type="module">
的時候發一次網絡請求, 而且在那個模塊中有可能還有其餘的模塊, 還得繼續髮網絡請求.可是在首次以後就可使用緩存了, 也不是不能夠接受, 並且也能夠選擇在開發環境時使用rollup進行打包.下面來實戰一下, 由於vue的獨佔期, 因此對vue的項目是無縫結合的, 可是我在工做中更多的是應用到了react, 如下代碼爲與react的結合
yarn init -y
yarn add @pika/react @pika/react-dom vite
@pika是esm模塊的前綴, 也就是react和react-dom的esm模塊形式module.exports = {
jsx: 'react',
plugins: [require('vite-plugin-react')]
}
複製代碼
index.html
, 以下<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
複製代碼
src/main.tsx
, 以下import React from 'react'
import style from './index.module.scss'
export default function() {
const [count, setCount] = React.useState(1)
return (
<div>
hello world
<button className={style.button} onClick={() => setCount(count + 1)}>
count: {count}
</button>
</div>
)
}
複製代碼
typed-scss-modules
以及sass
, 加個"tsm": "tsm src -w"
便可.這裏要注意, 使用模塊化的引入, 也就是import style from 'xxx.scss'
須要遵循vue中的命名規範, 須要加一個module後綴, 也就是必須命名爲xxx.module.scss
能夠看出整個項目的配置項是至關的少, 不少都黑盒處理了, 讓前端能夠更關注業務, 以後我會進一步研究其源碼, 敬請期待.
附上整個項目地址