vue里面的文件动态引入

在vue里,会出现很多文件引入的情况。常见的就是在router或者公共组件的引用,我们分别对这两种情况进行讨论,并提出优化方式。

一.router文件的引入

当我们的项目体系足够大时,将路由全都放在index.js文件是不优雅的,页面代码过于复杂会造成阅读和维护的困难。所以这个时候,我们一般采取分模块引用,一个模块对应一个js文件,里面存放对应的路由信息。但是当我们的模块足够多时,重复的文件引入对我们来说也是一个困扰,所以就可以使用动态引入。
路由文件
我们简单写几个文件为例。上面的文件除了index.js外分别对应不同模块,我们需要动态的将几个模块自动引入到index.js里面。
require.context
require.context是webpack提供的一个方法,可以获取一个特定的上下文。
该方法有三个参数(必填):
参数一:读取文件的路径(. 或者./表示同级)
参数二:是否遍历文件的子目录(默认false)
参数三:匹配文件的正则(注意会匹配到自己)
返回值为一个函数,函数有三个属性
属性一(Function): resolve(req) 接受一个参数request,request为test文件夹下面匹配文件的相对路径,该函数返回一个对象,对象里面的default属性代表相对路径下的文件信息。
返回这个匹配文件相对于整个工程的相对路径,参数req为keys方法返回的数组的元素
属性二(Function):keys() 返回匹配成功模块的名字组成的数组
属性三(String): id

了解了该方法后我们就可以进行文件的动态引入了。

//创建一个路由数组
let routerList = []
//获取该方法返回值,主要使用返回值的属性1和属性2
const requireAll = require.context('.', true, /\.js/)
//创建一个引入路由的动态方法
function importAllRouter(r) {
	//使用属性2获取对应文件的相对路径
	r.keys().forEach(item => {
		//排除index.js文件
		if(item !== './index.js') {
			if(Array.isArray(r(key).default)) {
				routerList = routerList.concat(r(key).default)
			}else {
				routerList.push(r(key).default)
			}
		}
	})
}

上面的代码有些地方可能难以理解,我们详细解释下:
r(key)使用了require.context返回值的属性1,我们可以拿到路径匹配的文件对象
在这里插入图片描述
这里我们会发现我们进行了数组判断,是因为在路由文件里有时候可能一个文件就只有一个路由对象,其余的都是子路由,所以直接使用了对象格式
在这里插入图片描述
但是有的时候会有多个平级路由,所以得使用数组格式
在这里插入图片描述

其实这个可以做个简单统一,统一使用数组可以取消判断。

r(key).default获取到的就是我们的路由文件里面的数据
在这里插入图片描述
最后我们将路由直接引入

const router = new VueRouter({
  routes: [...routerList]
})

二.公共组件的动态引入

项目里面的公共组件过多时,我们也可以使用上面的方法进行动态引入。
例如我们有以下几个公共组件
公共组件
想要进行动态引入我们需要使用插件形式进行操作
在src下面新建文件 importModul.js

const install = function (Vue) {
  const requireAll = require.context('@/views/modulUnifiedIn/components', true, /\.vue/)
  const modulList = requireAll.keys().map(item => requireAll(item))
  modulList.forEach(({
    default: modulObj
  }) => {
    Vue.component(modulObj.name, modulObj)
  });
}
export default install

插件形式可以是名为install的函数或者是包含install属性,属性值为函数的对象,我们这里直接使用install函数的形式。
逻辑大概与上面的路由引入一致,Vue.component可以进行组件的注册操作。

最后直接引用插件进行注册使用即可。

import importModulfrom './importModul'
Vue.use(importModul)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,在 Vue 可以动态引入不同的外部 `.less` 文件。一种常见的做法是使用 `vue-style-loader` 和 `less-loader` 这两个 loader,并且将样式文件的路径作为参数传递给 `import` 语句。 在 Vue文件组件,可以使用 `@import` 声明动态引入外部 `.less` 文件,如下所示: ```html <template> <div class="app"> ... </div> </template> <script> export default { name: 'App', mounted () { // 动态引入样式文件 import(`@/styles/${this.$route.name}.less`) } } </script> <style lang="less"> /* 这里可以定义组件自身的样式 */ </style> ``` 在上面的代码,`mounted` 钩子通过 `import` 语句动态引入了一个名为 `${this.$route.name}.less` 的样式文件。`${this.$route.name}` 是一个动态字符串,表示当前路由的名称,因此可以根据不同的路由动态引入不同的样式文件。注意,这里使用了 `vue-cli` 的别名 `@` 表示 `src` 目录。 同时,需要在 `vue.config.js` 配置 `vue-style-loader` 和 `less-loader`,如下所示: ```js module.exports = { chainWebpack: config => { config.module .rule('less') .test(/\.less$/) .use('vue-style-loader') .loader('vue-style-loader') .end() .use('css-loader') .loader('css-loader') .end() .use('less-loader') .loader('less-loader') .end() } } ``` 上述代码,使用 `chainWebpack` 方法配置了一个 `less` 的 loader 规则,并且使用了 `vue-style-loader` 和 `less-loader` 这两个 loader,以确保动态引入的样式文件能够正常解析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值