代码拉取完成,页面将自动刷新
同步操作将从 57code/vue3-study 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
const Koa = require('koa')
const app = new Koa()
const fs = require('fs')
const path = require('path')
const { parse } = require('@vue/compiler-sfc')
const { compile } = require('@vue/compiler-dom')
function rewriteImport(content) {
return content.replace(/from ['|"]([^'"]+)['|"]/g, function (s0, s1) {
// s0-完整匹配,s1-分组部分
// console.log(s0, s1);
// 返回要替换的内容
// 如果不是以. ../ /开头
// 就是裸模块导入,替换这些path
if (!s1.startsWith('.') && !s1.startsWith('/') && !s1.startsWith('../')) {
return `from '/@modules/${s1}'`
} else {
// 相对路径不做处理
return s0
}
})
}
app.use(async (ctx) => {
// ctx.body = 'kkb vite'
const url = ctx.request.url
if (url === '/') {
ctx.type = 'text/html'
ctx.body = fs.readFileSync('./index.html', 'utf-8')
} else if (url.endsWith('.js')) {
const p = path.resolve(__dirname, url.slice(1))
ctx.type = 'text/javascript'
const ret = fs.readFileSync(p, 'utf-8')
ctx.body = rewriteImport(ret)
} else if (url.startsWith('/@modules')) {
const moduleName = url.replace('/@modules/', '')
const prefix = path.resolve(__dirname, 'node_modules', moduleName)
const module = require(prefix + '/package.json').module
const filePath = path.join(prefix, module)
const ret = fs.readFileSync(filePath, 'utf8')
ctx.type = 'text/javascript'
ctx.body = rewriteImport(ret)
} else if (url.endsWith('.vue')) {
// 解析单文件组件相当于vue-loader做的事情
// 转换script部分:将默认导出的组件对象转换为常量
const p = path.resolve(__dirname, url.slice(1))
const ret = parse(fs.readFileSync(p, 'utf-8'))
const scriptContent = ret.descriptor.script.content
const script = scriptContent.replace('export default ', 'const __script = ')
// 转换template为模板请求
// 将转换获得的渲染函数设置到__script上
// 最后重新导出__script
ctx.type = 'text/javascript'
ctx.body = `
${rewriteImport(script)}
import { render as __render } from '${url}?type=template'
__script.render = __render
export default __script
`
} else if (url.endsWith('?type=template')) {
// 模板编译请求
const p = path.resolve(__dirname, url.split('?')[0].slice(1))
const ret = parse(fs.readFileSync(p, 'utf-8'))
const template = ret.descriptor.template.content
// 使用编译该模板
const render = compile(template, {mode: 'module'}).code
ctx.type = 'text/javascript'
ctx.body = rewriteImport(render)
} else if (url.endsWith('.png')) {
ctx.body = fs.readFileSync('src' + url)
}
})
app.listen(3000, () => {
console.log('kvite start');
})
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。