IT 全栈开发

vite 自带常用功能

2022-10-05  本文已影响0人  醋留香

vite 自带的功能:

  1. vite 具备 NPM 依赖解析 和 预构建

依赖: 是强缓存依赖,通过HTTP头来缓存请求得到的依赖
预构建: 用来将 CommonJS/UMD 转换为 ESM 格式, 靠 esbuild 来执行

  1. 模块热替换

利用的是 原生的 ESMHMR API

  1. TS

vite 自带ts转义功能, 并只是转义, 不检查类型,也是利用 esbuild 来将 TS --> JS 的

  1. JSX

vite 也自带 TSX ---> SJ的转义功能, 也是利用 esbuild 来完成的

  1. CSS

vite 在导入 .css 文件将会把内容插入到 <style> 标签中, 同时也带有 HMR 支持。 并且会自动变基。

变基的解释: 所有 CSS url() 引用,即使导入的文件在不同的目录中,也总是自动变基,以确保正确性。

因为vite自带有postcss-import功能, 所以, 也支持 CSS@import内联

当碰到以 .module.css 后缀结束的文件时, 会把该文件当成是一个 CSS Module, 进行模块处理, 并会得到一个模块对象。

代码如下:

/* example.module.css */ 
.red { color: red; }

import classes from './example.module.css' 
document.getElementById('foo').className = classes.red
  1. CSS 预处理器的功能

vite的目标直接就是现代浏览器, 所以, 不管你的项目中 写了什么样的 css 预处理代码, 比如: .scss, .sass, .less, .styl.stylus 等, vite 都已内置了支持功能, 无需配置, 可直接使用, 只需给项目安装一下对应的预处理模块依赖即可:

# .scss and .sass 
npm add -D sass 

# .less 
npm add -D less 

# .styl and .stylus 
npm add -D stylus

然后再给标签说一声即可

<style lang="sass">
  1. 防止 导入的 CSS 注入到页面?
import styles from './foo.css' // 样式将会注入页面 
import otherStyles from './bar.css?inline' // 样式不会注入页面
  1. vite 对静态资源的 处理

当我们将图片当成静态资源进行导入的时候, vite 会自动将该导入解析为一个url地址并返回, 我们的随意当成一个地址来进行使用

import imgUrl from './img.png' 
document.getElementById('hero-img').src = imgUrl

我们也可以通过加载是地址?后的query, 来控制器返回结果

// 显式加载资源为一个 URL 
import assetAsURL from './asset.js?url'

// 以字符串形式加载资源 
import assetAsString from './shader.glsl?raw'

// 加载为 Web Worker 
import Worker from './worker.js?worker'

// 在构建时 Web Worker 内联为 base64 字符串 
import InlineWorker from './worker.js?worker&inline'
  1. JSON 的支持

可以将 整个 JSON 当成模块对象来进行导入

// 导入整个对象 
import json from './example.json' 

// 对一个根字段使用具名导入 —— 有效帮助 treeshaking! 
import { field } from './example.json'
  1. 支持全局 多个 模块导入
// 一次导入多个 js 模块
const modules = import.meta.glob('./dir/*.js')

// 相当于下方的代码
// vite 生成的代码 
const modules = { 
    './dir/foo.js': () => import('./dir/foo.js'), 
    './dir/bar.js': () => import('./dir/bar.js') 
}

// 那么接下来, 我们就可以遍历 `modules` 对象的 key 值来访问相应的模块:
for (const path in modules) { 
    modules[path]().then((mod) => { 
        console.log(path, mod) 
    }) 
}

以上代码输入 多文件模块的 动态导入

如果不想动态导入, 想直接导入那么多模块, 你可以传入 { eager: true } 作为第二个参数, 代码如下:

const modules = import.meta.glob('./dir/*.js', { eager: true })

// 以上会被转译为下面的样子:
// vite 生成的代码 
import * as __glob__0_0 from './dir/foo.js' 
import * as __glob__0_1 from './dir/bar.js' 
const modules = { 
    './dir/foo.js': __glob__0_0, 
    './dir/bar.js': __glob__0_1 
}
  1. import.meta.glob(参数1 , 参数2) 函数的 用法
const modules = import.meta.glob(['./dir/*.js', './another/*.js'])
const modules = import.meta.glob(['./dir/*.js', '!**/bar.js'])
const modules = import.meta.glob('./dir/*.js', { import: 'setup' })
// vite 生成的代码 
const modules = { 
    './dir/foo.js': () => import('./dir/foo.js').then((m) => m.setup), 
    './dir/bar.js': () => import('./dir/bar.js').then((m) => m.setup) 
}
const modules = import.meta.glob('./dir/*.js', { 
    query: { foo: 'bar', bar: true } 
})

// vite 生成的代码 
const modules = { 
    './dir/foo.js': () => import('./dir/foo.js?foo=bar&bar=true').then((m) => m.setup), 
    './dir/bar.js': () => import('./dir/bar.js?foo=bar&bar=true').then((m) => m.setup) 
}

特别注意,所有 import.meta.glob 的参数都必须以字面量传入。不可以 在其中使用变量或表达式。

如要使用变量, 可利用 vite 提供的动态导入功能

  1. vite 之 动态导入
const module = await import(`./dir/${file}.js`)

注意: 该变量 file 只能支持 一层深 的文件名, 如果 filefoo/bar,导入将会失败

上一篇 下一篇

猜你喜欢

热点阅读