一个灵活的Vue组件脚本拆分合并插件,允许将Vue组件的脚本逻辑拆分到外部文件中,提高代码可维护性和组织结构。
- 🚀 简化组件结构 - 将复杂的脚本逻辑从Vue组件中分离
- 🔍 灵活的文件查找 - 多种命名约定和目录结构支持
- ⚙️ 高度可配置 - 自定义查找路径、文件扩展名和合并行为
- 🔄 开发与构建支持 - 在开发和构建过程中无缝工作
- 🔌 零依赖 - 仅使用Node.js内置模块
npm install vue-script-merger --save-dev
# 或
yarn add vue-script-merger -D
# 或
pnpm add vue-script-merger -Dimport { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueScriptMerger from 'vue-script-merger'
export default defineConfig({
plugins: [
vue(),
vueScriptMerger()
]
})组件文件 (RelationShip.vue):
<template>
<div>
<!-- 组件模板 -->
</div>
</template>
<script setup>
// 组件内可以保留必要的导入或简单逻辑
// 复杂逻辑已移至外部脚本文件
</script>
<style scoped>
/* 样式代码 */
</style>外部脚本文件 (relationship.script.js):
import { ref, onMounted } from 'vue'
// 状态变量
const relationships = ref([])
const isLoading = ref(false)
// 方法
function loadRelationships() {
isLoading.value = true
// 加载数据逻辑...
}
// 生命周期钩子
onMounted(() => {
loadRelationships()
})vueScriptMerger({
// 脚本查找路径(相对于src目录、项目根目录或绝对路径)
scriptPaths: ['views', 'scripts', 'components'],
// 脚本文件扩展名(按优先级排序)
extensions: ['.script.js', '.vue.js', '.js'],
// 路径别名映射
aliases: {
'@scripts': '/path/to/scripts'
},
// 是否启用调试日志
debug: false,
// 项目根目录(默认为process.cwd())
rootDir: process.cwd(),
// 源代码目录(默认为src)
srcDir: 'src',
// 注入脚本时的注释模板
injectComment: '// 自动导入的外部脚本: {filename}',
// 是否优先使用同目录下的脚本文件
useSameDir: true
})插件按以下顺序查找外部脚本文件:
- 如果
useSameDir为true,首先在与Vue组件相同的目录中查找同名的脚本文件 - 如果同目录下未找到,则在
scriptPaths配置的所有目录中查找匹配的文件 - 匹配逻辑包括:
- 完全匹配文件名(
RelationShip.vue→RelationShip.script.js) - 基本名称匹配(
RelationShip.vue→relationship.js) - 目录结构匹配(
RelationShip.vue→RelationShip/index.script.js)
- 完全匹配文件名(
vueScriptMerger({
resolveScriptPath: (vueFilePath) => {
// 自定义脚本路径解析逻辑
const vueBaseName = path.basename(vueFilePath, '.vue')
const customScriptPath = path.join('/custom/path', `${vueBaseName}.logic.js`)
return fs.existsSync(customScriptPath) ? customScriptPath : null
}
})vueScriptMerger({
transform: (vueCode, scriptContent, comment, vueFilePath, scriptPath) => {
// 自定义代码合并逻辑
if (/<script\s+setup[^>]*>/.test(vueCode)) {
return vueCode.replace(
/(<script\s+setup[^>]*>)([\s\S]*?)(<\/script>)/,
(match, openTag, content, closeTag) => {
return `${openTag}\n/* 自定义注入逻辑 */\n${scriptContent}\n${content}${closeTag}`
}
)
}
return vueCode.replace(
/<\/template>/,
`</template>\n\n<script setup>\n${comment}\n${scriptContent}\n</script>`
)
}
})vue-script-merger支持多种项目结构组织方式:
src/
└── views/
├── book/
│ ├── RelationShip.vue
│ └── RelationShip.script.js // 与组件同目录
src/
├── views/
│ └── book/
│ └── RelationShip.vue
└── scripts/
└── relationship.script.js // 集中管理的脚本目录
src/
├── views/
│ └── book/
│ └── RelationShip.vue
└── scripts/
└── book/
└── relationship.script.js // 与目录结构匹配
A: 插件使用了文件缓存机制,仅在首次加载时查找文件,对构建性能影响很小。
A: 启用debug: true选项,插件会在控制台输出详细的匹配和合并信息。
A: 是的,只需将.script.js改为.script.ts,并在extensions配置中添加.ts扩展名。
A: 是的,当您修改外部脚本文件时,Vite会检测到更改并重新运行插件。
MIT