代码之家  ›  专栏  ›  技术社区  ›  Perp

vue在部署不工作时路由延迟加载

  •  1
  • Perp  · 技术社区  · 6 年前

    在我的路由中实现如下延迟加载后:

    component: () => import('./pages/home/index/index.vue')
    

    在本地,它可以正常工作(在某些路线上丢失字体)。

    当代码由CI/CD环境部署时,使用延迟加载设置的任何路由都不会加载到浏览器中,出现以下控制台错误:

    Uncaught SyntaxError: Unexpected token <
    

    检查问题后,它指向 <head> 标签,里面有:

    <link href=/dist/static/css/app.4d19fef0c231f16b8783490b2895fe94.css rel=stylesheet><link href=/dist/static/css/app.1fa1a352ec9d24165aab94b33bba4db2.css rel=stylesheet>
    

    这是最后一个捆绑包中拆分的css文件。

    这说明我还没有在网页配置中很好地配置一些东西?

    非常感谢您的帮助。

    Web包配置是标准vue cli配置(这是产品配置):

    var path = require('path')
    var utils = require('./utils')
    var webpack = require('webpack')
    var config = require('../config')
    var merge = require('webpack-merge')
    var baseWebpackConfig = require('./webpack.base.conf')
    var CopyWebpackPlugin = require('copy-webpack-plugin')
    var HtmlWebpackPlugin = require('html-webpack-plugin')
    var ExtractTextPlugin = require('extract-text-webpack-plugin')
    var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
    
    var env = config.build.env
    
    var webpackConfig = merge(baseWebpackConfig, {
      // The following line must be used for production because of the 
      // folder structure we have in the packaged app.  
      //context: __dirname + "/../../app",
    
      module: {
        rules: utils.styleLoaders({
          sourceMap: config.build.productionSourceMap,
          extract: true
        })
      },
      devtool: config.build.productionSourceMap ? '#source-map' : false,
      output: {
        path: config.build.assetsRoot,
        filename: utils.assetsPath('js/[name].[chunkhash].js'),
        chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
      },
      plugins: [
        // http://vuejs.github.io/vue-loader/en/workflow/production.html
        new webpack.DefinePlugin({
          'process.env': env
        }),
        new webpack.optimize.UglifyJsPlugin({
         // Eliminate comments
            comments: false,
    
        // Compression specific options
           compress: {
             // remove warnings
                warnings: false,
    
             // Drop console statements
                drop_console: true
           },
        }),
        // extract css into its own file
        new ExtractTextPlugin({
          filename: utils.assetsPath('css/[name].[contenthash].css')
        }),
        // Compress extracted CSS. We are using this plugin so that possible
        // duplicated CSS from different components can be deduped.
        new OptimizeCSSPlugin(),
        // generate dist index.html with correct asset hash for caching.
        // you can customize output by editing /index.html
        // see https://github.com/ampedandwired/html-webpack-plugin
        new HtmlWebpackPlugin({
          filename: config.build.index,
          template: 'index.html',
          inject: true,
          minify: {
            removeComments: true,
            collapseWhitespace: true,
            removeAttributeQuotes: true
            // more options:
            // https://github.com/kangax/html-minifier#options-quick-reference
          },
          // necessary to consistently work with multiple chunks via CommonsChunkPlugin
          chunksSortMode: 'dependency'
        }),
        // split vendor js into its own file
        new webpack.optimize.CommonsChunkPlugin({
          name: 'vendor',
          minChunks: function (module, count) {
            // any required modules inside node_modules are extracted to vendor
            return (
              module.resource &&
              /\.js$/.test(module.resource) &&
              module.resource.indexOf(
                path.join(__dirname, '../node_modules')
              ) === 0
            )
          }
        }),
        // extract webpack runtime and module manifest to its own file in order to
        // prevent vendor hash from being updated whenever app bundle is updated
        new webpack.optimize.CommonsChunkPlugin({
          name: 'manifest',
          chunks: ['vendor']
        }),
        // copy custom static assets
        new CopyWebpackPlugin([
          {
            from: path.resolve(__dirname, '../static'),
            to: config.build.assetsSubDirectory,
            ignore: ['.*']
          }
        ])
      ]
    })
    
    if (config.build.productionGzip) {
      var CompressionWebpackPlugin = require('compression-webpack-plugin')
    
      webpackConfig.plugins.push(
        new CompressionWebpackPlugin({
          asset: '[path].gz[query]',
          algorithm: 'gzip',
          test: new RegExp(
            '\\.(' +
            config.build.productionGzipExtensions.join('|') +
            ')$'
          ),
          threshold: 10240,
          minRatio: 0.8
        })
      )
    }
    
    if (config.build.bundleAnalyzerReport) {
      var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
      webpackConfig.plugins.push(new BundleAnalyzerPlugin())
    }
    
    module.exports = webpackConfig
    

    生成产品设置:

     build: {
        env: require('./prod.env'),
        index: path.resolve(__dirname, '../index.html'),
    //    index: path.resolve(__dirname, '../dist/index.html'),
        assetsRoot: path.resolve(__dirname, '../dist'),
    //    assetsSubDirectory: '/static',
        assetsSubDirectory: 'static',
    //    assetsPublicPath: '/app/dist/',
       assetsPublicPath: '/',
        // assetsPublicPath: '/dist/',
        fontPath: '/static',
        productionSourceMap: true,
        // Gzip off by default as many popular static hosts such as
        // Surge or Netlify already gzip all static assets for you.
        // Before setting to `true`, make sure to:
        // npm install --save-dev compression-webpack-plugin
        productionGzip: false,
        productionGzipExtensions: ['js', 'css'],
        // Run the build command with an extra argument to
        // View the bundle analyzer report after build finishes:
        // `npm run build --report`
        // Set to `true` or `false` to always turn it on or off
        bundleAnalyzerReport: process.env.npm_config_report
      },
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Ru Chern Chong ABHINAV    6 年前

    因为您提到您正在使用 Vue Router 用于你的应用程序。

    添加 base: '/sub-directory/ 输入路由器代码。

    例如:

    export default new Router({
      base: '/foo-bar/',
      routes
    })
    

    还记得在webpack配置文件中设置公共资产路径,以便 /sub-directory/

        2
  •  0
  •   Perp    6 年前

    最后,我修复了修改的问题 assetsPublicPath: '/dist', assetsPublicPath: '/dist/', .

    主要问题是我的树结构应该 dist/static/... 确实如此 diststatic/... 对于区块文件

    希望这会对某人有所帮助。