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
能够看出整个项目的配置项是至关的少, 不少都黑盒处理了, 让前端能够更关注业务, 以后我会进一步研究其源码, 敬请期待.
附上整个项目地址