multiple pages in Vue.js CLI

后端 未结 5 669
温柔的废话
温柔的废话 2020-12-04 06:45

I\'m having trouble figuring out how to have multiple pages in a Vue CLI project. Right now I have my home page with a few components and I want to create another page but I

5条回答
  •  感动是毒
    2020-12-04 06:59

    EDIT: Vue has this built-in. Skip to the bottom for more.

    Original answer:

    There are two ways to interpret your question, and therefore to answer it.

    The first interpretation is: "how can I support routing to different pages within the same single-page app, e.g. localhost:8080/about and localhost:8080/report etc?". The answer to this is to use the router. It's reasonably straightforward and works well.

    The second interpretation is: "my app is complex, and I have multiple single-page applications, e.g. one app for the 'website' part, one app for consumers to log in and do work, one app for admins, etc - how can vue do this, without making three entirely separate repositories?"

    The answer to the latter is a single repository with multiple single-page apps. This demo looks like exactly what you're after:

    https://github.com/Plortinus/vue-multiple-pages/

    Look in particular at: https://github.com/Plortinus/vue-multiple-pages/blob/master/vue.config.js

    Updated answer:

    It turns out that vuejs has the idea of multiple top-level pages built-in. I mean, it makes sense - it's going to be really common, despite what many incorrect answers are saying about "no, it's for single page apps"!

    You want the pages option in the vue.config.js file:

    https://cli.vuejs.org/config/#pages

    If your project doesn't have that file in the root directory, create it and vuejs will discover it.

    There is a long and a short way to define each page. I used the short form here:

    module.exports = {
      pages: {
        index: 'src/pages/index/main.ts',
        experiment: 'src/pages/experiment/main.ts'
      }
    }
    

    You don't have to put your work under "pages". It could be "/src/apps/index/index.ts" or whatever.

    After moving code around and changing some imports from:

    import HelloWorld from './components/HelloWorld'
    

    to

    import HelloWorld from '@/components/HelloWorld'
    

    The app works - but the "experiment" app in my repo had to be loaded like this:

    http://localhost:8080/experiment.html
    

    Pretty ugly, and even worse because it uses the router which resulted in URLs like:

    http://localhost:8080/experiment.html/about
    

    Ugh.

    Fortunately, this stackoverflow answer solved it. Update the vue.config.js file to include devServer options (make sure this is at the top level of the exported object:

    devServer: {
      historyApiFallback: {
        rewrites: [
          { from: /\/index/, to: '/index.html' },
          { from: /\/experiment/, to: '/experiment.html' }
        ]
      }
    }
    

    Then also modify the router.ts file to append the extra path (in my case "experiment/":

    export default new Router({
      mode: 'history',
      base: process.env.BASE_URL + 'experiment/',
      ...
    

    Then URLs resolve nicely, e.g.: http://localhost:8080/experiment/about

提交回复
热议问题