在 Vue Webpack Cli 中通过 axios 获取路由列表

get List of routes via axios in Vue Webpack Cli

我在我的 Vue Webpack Cli 项目中使用 prerender-spa-plugin。就像我在 webpack.prod.conf.js 中注册插件一样

...
plugins: [
  ...
  new PrerenderSpaPlugin(
    path.join(__dirname, '../dist'),
    ['/', '/about', '/contact'],
    {
      captureAfterTime: 5000
    }
  )
]

我想知道是否可以通过 axios 调用获取路由数组列表。 我尝试了以下但没有成功:

var routes = axios.get('http://myapi.com/api').then(function (response) {
  return response.map(function (response) {
    return '/base/' + response.slug
  })
})

plugins: [
  ...
  new PrerenderSpaPlugin(
    path.join(__dirname, '../dist'),
    routes,
    {
      captureAfterTime: 5000
    }
  )
]

由于我的 Javascript 知识匮乏,我无法解决这个问题。感谢任何提示。

此致

这目前无法工作(或至少可靠地工作),因为 Webpack 假设您的配置默认是同步的。要解决此问题,请使用 Webpack 对 asynchronous configuration 和 return 的支持,这是在您的路由请求后解决的承诺。

如果您处于支持 async/await(节点 8+)的环境中,那么它就像导出 async 函数一样简单。否则,return一个new Promise:

// webpack.conf.js
module.exports = async function () {
  const response = await axios.get('http://myapi.com/api')
  const routes = response.map((response) => {
    return '/base/' + response.slug
  })

  return {
    plugins: [
      // ...
      new PrerenderSpaPlugin(
        path.join(__dirname, '../dist'),
        routes,
        {
          captureAfterTime: 5000
        }
      )
    ]
  }
}

如果这不是一个选项,您始终可以有一个任务来发出此请求,将其写入 json 文件,然后 require('./route-response.json') 在您的配置中。

我有类似的要求 - 从我的 API 获取路线列表。我最终创建了一个预构建脚本 - prebuild.js

const fs = require('fs')
const axios = require('axios')

// Fetch data from API
axios.get('http://myapi.com/api.php')
  .then(function(response) {
    const data = response.data
    try {
      // Save the route list to local file
      fs.writeFileSync('./route-response.js', data)
    } catch(err) {
      console.log(err)
    }
  })
  .catch(function(err) {
    console.log(err)
  })

我的API发送route-response.js文件的数据,准备直接保存,npm消费。您可以改为在 Node 中处理这种格式设置。示例格式:

module.exports = {
  theList: [
    '/',
    '/about',
    '/contact',
    '/login',
    '/register'
  ]
}

以上文件在webpack.prod.conf.js中获取如下:

...
const routeList = require('./route-response.js')
...
const webpackConfig = merge(baseWebpackConfig, {
  ...
  plugins: [
    ...
    new PrerenderSPAPlugin({
      staticDir: path.resolve(__dirname, '../dist'),
      routes: routeList.theList,
      renderer: new PuppeteerRenderer()
    })
    ...
  ]
  ...
})

最后,将预构建脚本添加到 package.json

  • 预构建: 运行 构建步骤之前。
  • 构建后: 运行 构建步骤后。

这是一个示例

...
"scripts": {
  "dev": "node build/dev-server.js",
  "prebuild": "node build/prebuild.js",
  "build": "node build/build.js"
},
"dependencies": {
...

这样,我只需要 运行 npm 运行 build