New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
vite #132
Comments
问题cjs dep 中 require('xxx.css') 导致变成动态 require 的问题如 node_modules/react-command-palette/dist/command-palette.js 里 require('xxx.css'), 经过 pre-bundle 变成了运行时
解决dev: vite-plugin-commonjs |
|
vite-plugin-monkeyreact preamble codeimport react from '@vitejs/plugin-react'
import { defineConfig, Plugin, ResolvedConfig } from 'vite'
// https://github.com/vitejs/vite/blob/v2.9.9/packages/plugin-react/src/index.ts#L324-L334
// https://github.com/vitejs/vite/blob/v2.9.9/packages/plugin-react/src/fast-refresh.ts#L29-L35
function viteReactPreamble(): Plugin {
const virtualModuleId = 'virtual:vite-react-preamble'
const resolvedVirtualModuleId = '\0' + virtualModuleId
let resolvedConfig: ResolvedConfig
return {
name: 'vite-react-preamble', // required, will show up in warnings and errors
configResolved(config) {
resolvedConfig = config
},
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
if (resolvedConfig.mode === 'development') {
const preambleCode = react.preambleCode.replace(`__BASE__`, resolvedConfig.base || '/')
return `
${preambleCode}
;console.log('[vite-react-preamble]: preamble loaded')
`
} else {
return ''
}
}
},
}
} build 输出 file:///path/to/xxx.user.js 方便安装function printDistScriptFileUrl(): Plugin {
let resolvedConfig: ResolvedConfig
return {
name: 'monkey:print-dist-script-file-url',
configResolved(config) {
resolvedConfig = config
},
closeBundle() {
// @ts-ignore
// const fileName = resolvedConfig.build.lib?.fileName?.()
// const dir = resolvedConfig.build.outDir
// const targetDir = path.join(__dirname, dir)
// const targetFile = path.join(targetDir, fileName || '')
const targetFile = path.join(__dirname, 'dist', `${pkg.name}.user.js`)
const u = pathToFileURL(targetFile)
console.log('File URL: %s', u)
},
}
} 不想写死的话
externalGlobals举例 exterbalGlobals: { lodash: ['_', (version, name) => `https://unpkg.com/${name}@${version}`] } version 是由 vite-plugin-monkey 在 node_modules 目录通过 可以通过自己处理好, 再传递给 vite-plugin-monkey import monkey, { MonkeyOption, MonkeyUserScript } from 'vite-plugin-monkey'
// 手动处理 external global 的 version
type ExternalGlobals = NonNullable<NonNullable<MonkeyOption['build']>['externalGlobals']>
function processExternalGlobals(config: ExternalGlobals) {
for (const [k, v] of Object.entries(config)) {
if (!Array.isArray(v) || typeof v[1] !== 'function') continue
const [globalVar, pathFn] = v
const { version } = require(`${k}/package.json`)
const newV = pathFn(version, k)
config[k] = [globalVar, newV]
}
console.log(config)
return config
}
export default defineConfig({
plugins: [
monkey({
build: {
externalGlobals: processExternalGlobals({
lodash: ['_', (name, version) => `https://unpkg.com/${name}@${version}`]
})
}
})
]
}) external helperconst UNPKG = 'https://unpkg.com/'
const scriptUrlFactory =
(subpath = '') =>
(name: string, version: string) => {
if (subpath && !subpath.startsWith('/')) subpath = '/' + subpath
return `${UNPKG}${name}@${version}${subpath}`
}
const x: ExtrenalGlobals = {
lodash: ['_', scriptUrlFactory()]
} |
Vite HMRconsole.log('Loading mount', state.visible, root, import.meta.url)
const hot = import.meta.hot
if (hot) {
hot.dispose(() => {
console.log('Loading hot dispose', import.meta.url)
})
hot.accept(() => {
console.log('Loading hot accepts', state.visible, root, hot.data, import.meta.url)
})
}
本地状态恢复理解了 dispose & accept 总是在 old version 执行, new version 代码在 dispose 和 accept 中间执行, 就可以使用热更新保持本地变量了 import {proxy} from 'valtio'
let state = proxy({ some: 'state' })
let root: React.Root | undefined
if (import.meta.hot) {
const hot = import.meta.hot
// in new version, resume data from old version
if (hot.data.root) root = hot.data.root
if (hot.data.state) state = hot.data.state
hot.dispose(() => {
// save state when dispose old version
hot.data.root = root
hot.data.state = state
})
hot.accept(() => {
// console.log('Loading hot accepts', import.meta.url)
})
} 和下面
抽象成
|
plugin reactreact refresh boundary 判断规则: 所有的导出"像是"一个 React 组件, 即只要第一个字母大写即可. 除了通过命名骗过 plugin, 还可以自己写 if (import.meta.hot) {
import.meta.hot.accept()
}
|
node builtin modulese.g https://medium.com/@ftaioli/using-node-js-builtin-modules-with-vite-6194737c2cd2 只要设置 alias 即可
|
rollup-plugin-cleanup
两层: filter + ext 白名单 使用 command === 'build' &&
cleanup({
extensions: ['js', 'jsx', 'mjs', 'ts', 'tsx'],
include: [import.meta.dirname + '/src/**/*'],
}), |
No description provided.
The text was updated successfully, but these errors were encountered: