vite.config.js
css配置
css模块化配置
export default defineConfig({
plugins: [vue()],
css:{
modules:{//对css模块化的默认行为的覆盖,配置之后会交由postcss处理
localsConvention:"camelCaseOnly",//修改生成的配置对象的key值 展示形式 eg:驼峰命名
scopeBehaviour:'local',//配置当前的模块化行为是模块化还是全局,有hash就是开启模块化的标志。
generateScopedName:"[name]_[local]_[hash:5]",
hashPrefix:'hellow',//用户来配置独特的hash
globalModulePaths:[path.resolve('/dawdsa')],//代表不想参与到css模块化的路径
}
}
})
css预处理器配置
preprocessorOptions:{//key+config形式
less:{
math:"always",//识别计算表达式
globalVars:{
themeColor:'red'
}, //定义全局变量
},
sass:{
}
},
devSourcemap:true,//开启sourcemap
}
postcss配置
export default defineConfig({
plugins: [vue()],
css:{
modules:{//对css模块化的默认行为的覆盖,配置之后会交由postcss处理
localsConvention:"camelCaseOnly",//修改生成的配置对象的key值 展示形式 eg:驼峰命名
scopeBehaviour:'local',//配置当前的模块化行为是模块化还是全局,有hash就是开启模块化的标志。
generateScopedName:"[name]_[local]_[hash:5]",
hashPrefix:'hellow',//用户来配置独特的hash
globalModulePaths:[path.resolve('/dawdsa')],//代表不想参与到css模块化的路径
},
preprocessorOptions:{//key+config形式
less:{
math:"always",//识别计算表达式
globalVars:{
themeColor:'red'
}, //定义全局变量
},
sass:{
}
},
devSourcemap:true,//开启sourcemap
postcss:{
plugins:[postCssPreset(
//导入变量,到处变量, autofix,...
)] //预设options=> https://github.com/csstools/postcss-preset-env
}
}
})
vite对静态资源的处理
对大多数静态资源都是开箱即用。
resolve配置项==》和webpack用法一样
生产构建静态资源
build:{
rollupOptions:{
output:{
assetFileNames:'[hash].[name].[ext]'
},
},
assetsInlineLimit:4096000,
outDir:'TestDir',
assetsDir:'static'
}
vite部分插件的源码阅读
vite-aliases:通过读取更目录下src的所有文件,将其分为文件夹和文件,定义resolve配置对象,将键定义为所需要的别名,而值设置为文件夹的路径地址。最后返回该配置对象,vite会自动将其与vite.config.js中的配置对象进行合并(在插件的config钩子中)。
vite-plugin-html:将html中的字符串变量进行替换(在transformIndexHtml钩子中完成)
手写vite-plugin-mock:(在configureServer钩子中完成)
const fs = require('fs')
const path = require('path')
module.exports = (options)=>{
// 主要就是拦截http去请求
// 当我们通过fetch和axios去发送请求时
// 当打给vite本地服务器的时候,vitesever接管
return {
configureServer(server){
const mockStat = fs.statSync('mock');
const isDirectory = mockStat.isDirectory();
let mockResult = [];
if(isDirectory){
mockResult = require(path.resolve(process.cwd(),'./mock/index'))
}
server.middlewares.use((req,res,next)=>{
let matchIndex = mockResult.findIndex(mockDescription=>mockDescription.url==req.url)
if(matchIndex!=-1){
res.setHeader('Content-type','application/json')
res.end(JSON.stringify(mockResult[matchIndex]))
}else
next()
})
}
}
}
vite作为开箱即用的工具内置了那些功能插件
源码地址 https://github.com/vitejs/vite/blob/e223f84af877d354e197ca0ce9103777ed247718/packages/vite/src/node/plugins/index.ts
在vite的源码中我们可以看到内置的一些功能
import aliasPlugin from '@rollup/plugin-alias'
import type { PluginHookUtils, ResolvedConfig } from '../config'
import { isDepsOptimizerEnabled } from '../config'
import type { HookHandler, Plugin } from '../plugin'
import { getDepsOptimizer } from '../optimizer'
import { shouldExternalizeForSSR } from '../ssr/ssrExternal'
import { jsonPlugin } from './json'
import { resolvePlugin } from './resolve'
import { optimizedDepsBuildPlugin, optimizedDepsPlugin } from './optimizedDeps'
import { esbuildPlugin } from './esbuild'
import { importAnalysisPlugin } from './importAnalysis'
import { cssPlugin, cssPostPlugin } from './css'
import { assetPlugin } from './asset'
import { clientInjectionsPlugin } from './clientInjections'
import { buildHtmlPlugin, htmlInlineProxyPlugin } from './html'
import { wasmFallbackPlugin, wasmHelperPlugin } from './wasm'
import { modulePreloadPolyfillPlugin } from './modulePreloadPolyfill'
import { webWorkerPlugin } from './worker'
import { preAliasPlugin } from './preAlias'
import { definePlugin } from './define'
import { ssrRequireHookPlugin } from './ssrRequireHook'
import { workerImportMetaUrlPlugin } from './workerImportMetaUrl'
import { assetImportMetaUrlPlugin } from './assetImportMetaUrl'
import { ensureWatchPlugin } from './ensureWatch'
import { metadataPlugin } from './metadata'
import { dynamicImportVarsPlugin } from './dynamicImportVars'
import { importGlobPlugin } from './importMetaGlob'