vite dynamic import 怎么实现
如图,我想这样引入,提示我不成功,
我配置了rollup-dynamic-import还是不行,是我配置的不对吗
============== 2021-05-11 补充 ==============
很多人加我QQ问我,其实这个问题是vite1时候问的,那时候动态导入确实比较麻烦
vite2发布之后,glob import 这个API能满足大家的需要
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
统一回答一下,这是去年的提问了。其实早在vite2发布的时候就已经有新的解决方案了,vite2官方提供了glob-import 方法,之前加我QQ的不用加啦
害,折腾了一下,虽然方法不完美,还有限制,但是好歹算是解决了,生产环境正常运行
https://github.com/qiaen/huam...
运行结果
http://mulan.diumx.com/#/
问题解决了吗?我也是卡在这里了,打包后找不到动态路由文件
打包的时候将动态引入这块动态改写一下,就行了。从一个别人项目里找到了一种方法。
transforms: [
dynamicImportTransform(process.env.NODE_ENV === 'production'), // 生产build时进行这个操作
]
2.dynamicImportTransform
import glob from 'glob';
import {Transform} from 'vite/dist/node/transform.js';
function getPath(path: string) {
const lastIndex = path.lastIndexOf('.');
if (lastIndex !== -1) {
path = path.substring(0, lastIndex);
}
return path.replace('src/views/modules', '');
}
const dynamicImportTransform = function (enableDynamicImport: boolean): Transform {
return {
test(ctx) {
const { path } = ctx;
// Only convert the file
return path.includes('src/utils/doDynamicImport.ts') || path.includes(
src\\utils\\doDynamicImport.ts
);},
transform(ctx) {
const { code } = ctx;
if (!enableDynamicImport) {
return code;
}
// Only convert the dir
try {
const files = glob.sync('src/views/modules//.{vue,tsx}', { cwd: process.cwd() });
// @ts-ignore
const result = `
export default function (id) { console.log('id:' + id); switch (id) { ${files.map((p: string) =>` case '${getPath(p)}': return () => import('${p.replace('src/views', '/@/views')
.replace(////g, '/')}');`.replace('.tsx', '')
) .join('n ')}
default: return Promise.reject(new Error("Unknown variable dynamic import: " + id)); } }nn
`;
return result;
} catch (error) {
console.error(error);
return code;
}
},
};
};
export default dynamicImportTransform;
3.src/utils/doDynamicImport.ts
export default function (name) {
return name;
}
4.在动态导入组件的地方直接用doDynamicImport('组件路径'). 打包的时候上面第3个那块代码会被第2条的逻辑给替换掉。
这里判断下。打包的时候才是这个逻辑。否则还是之前的
defineAsyncComponent(isDevMode()?()=>import('组件路径'):doDynamicImport('组件路径'))
import { defineAsyncComponent } from 'vue'
component: (path) => defineAsyncComponent(() => import(
${path}.vue
))https://github.com/vitejs/vit...