【问题标题】:How to include all "vue" files from directory into the build without explicitly importing them如何将目录中的所有“vue”文件包含到构建中而不显式导入它们
【发布时间】:2021-01-15 10:24:08
【问题描述】:

有没有办法在我的views/ 文件夹中构建所有 .vue 文件,而不直接将它们导入我的 vue 应用程序? 我想要实现的是一个具有动态路由定义的路由器,它将从一个配置中填充,该配置是一个 json,其中填充了名称、路由器路径和应该延迟加载的组件名称。 我现在的问题:该应用程序只构建在我的应用程序某处导入的文件。我需要的是:将views/ 中的所有 文件构建为块,以便能够拥有动态路由器定义。

感谢您的帮助:)

【问题讨论】:

    标签: vue.js webpack vue-cli


    【解决方案1】:

    没有提供任何代码很难给出正确的解决方案,但我会尝试

    使用这样的代码:

    // route definition loaded from json
    const routeDef = [
      { name: 'about', path: '/about', componentName: 'about' },
      { name: 'profile', path: '/profile', componentName: 'profile' }
    ]
    
    // we can create routes like this
    const routes = routeDef.map(function(def) {
      return {
        name: def.name,
        path: def.path,
        component: () => import('@/views/' + def.componentName + '.vue')
      }
    })
    
    const router = new VueRouter({
      routes: routes
    })
    

    通过使用import('@/views/' + def.componentName + '.vue'),你告诉Webpack 我想导入views 目录中的.vue 文件之一,但在运行时会知道哪个文件。因此,Webpack 会将所有文件捆绑在该目录中,并使其在运行时可用于导入......

    请注意,您传递给import() 的内容非常重要 - 部分参数必须始终是静态字符串,因此 Webpack 至少对目录有一些线索(import(def.componentName) 不会工作) - 请参阅docs

    附加示例 - 在运行时从服务器加载路由定义

    router.js

    export default createRouter() {
      return axios.get('/getRouteDefinitions').then(function(data) {
        
        const routes = data.routeDef.map(function(def) {
          return {
            name: def.name,
            path: def.path,
            component: () => import('@/views/' + def.componentName + '.vue')
          }
        })
    
        return new VueRouter({
          routes: routes
        })
      })
    }
    

    main.js

    import VueRouter from `VueRouter`
    import createRouter from `router.js`
    
    Vue.use(VueRouter)
    
    createRouter().then(function(router) {
      const app = new Vue({
        router
      })
      app.$mount("#app")
    })
    

    【讨论】:

    • 感谢您的回答。所以我必须在构建前端之前定义列表?没有办法说“好吧,包 X 正在单独构建一些视图,而包 Y 正在使用包 X 中的命名视图获取一些异步路由定义”
    • 所以我必须在构建前端之前定义列表 什么列表?您的意思是路线列表(在我的示例中为reouteDef)?不,您不需要 - 该列表可以在运行时从服务器异步加载。但是当然代码看起来会有些不同,因为您需要在加载数据后创建路由器...
    • 好的,谢谢。导入延迟加载路线的方式是我已经知道的。但是你知道我如何通过 vue.config.js 告诉 webpack 编译 /views 中的所有文件吗?因为在构建时,应用程序对路由一无所知,因为它们在执行网页时正在加载,所以它根本不会编译我的 views/*.vue 文件。所以应用程序在我的路由器中找不到为路由定义的视图。
    • 也许你自己的代码还有其他问题(这就是为什么发布一些代码总是好的)但是我的答案中的代码 足够 让 Webpack 捆绑所有 @来自@/views 目录的 987654334@ 文件。它不需要知道任何关于您的路线的信息,import() 声明说明了一切......
    • 好的,我会试试这个。问题是:目前我只是为我的“概念”尝试和错误的东西:D所以还没有真正的代码。我正在尝试一些东西,再次删除它,重新开始^^ 只需要基本的homehome2 vue,上面有hello world 和一个路由器,所以没什么花哨的。来自vue-cli create 进程的基本设置
    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 2020-12-03
    • 2021-01-05
    • 2014-04-16
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多