【问题标题】:missing js files from _nuxt folder_nuxt 文件夹中缺少 js 文件
【发布时间】:2021-08-30 18:31:46
【问题描述】:

我正在使用 nuxt 2.15.4,我突然遇到了一个非常奇怪的问题。我的代码工作正常(实际上在本地 上仍然工作正常),但现在在服务器上构建后它不会正确加载,我收到这些错误:GET https://example.com/_nuxt/8bab19f.js net::ERR_ABORTED 404 (Not Found)。怎么了?实际上我在其他服务器上有两个我的应用程序的克隆,它们工作正常!可能是因为构建时出现捆绑包大小警告吗?如果是这样,我怎样才能减小捆绑包的大小(请提供示例的实用答案;))??

//nuxt.config.js
import colors from 'vuetify/es5/util/colors'
const env = require('dotenv').config()
const webpack = require('webpack')
export default {
  
  telemetry: false,

  srcDir: process.env.THEME_CUSTOMIZE === 'true' ? 'src/themes/customs/' : 'src/themes/'+process.env.THEME+'/',

  loading: {
    color: 'green',
    failedColor: 'red',
    height: '3px'
  },
  router: {
  },
  head: {
    title: process.env.SITE_TITLE + ' | ' + process.env.SITE_SHORT_DESC || '',
    htmlAttrs: {
      lang: process.env.SITE_LANGUAGE || 'en'
    },
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'keywords', name: 'keywords', content: process.env.SITE_KEYWORDS || '' },
      { hid: 'description', name: 'description', content: process.env.SITE_DESCRIPTION || '' },
      { hid: 'robots', name: 'robots', content: process.env.SITE_ROBOTS || '' },
      { hid: 'googlebot', name: 'googlebot', content: process.env.SITE_GOOGLE_BOT || '' },
      { hid: 'bingbot', name: 'bingbot', content: process.env.SITE_BING_BOT || '' },
      { hid: 'og:locale', name: 'og:locale', content: process.env.SITE_OG_LOCALE || '' },
      { hid: 'og:type', name: 'og:type', content: process.env.SITE_OG_TYPE || '' },
      { hid: 'og:title', name: 'og:title', content: process.env.SITE_OG_TITLE || '' },
      { hid: 'og:description', name: 'og:description', content: process.env.SITE_OG_DESCRIPTION || '' },
      { hid: 'og:url', name: 'og:url', content: process.env.SITE_BASE_URL || '' },
      { hid: 'og:site_name', name: 'og:site_name', content: process.env.SITE_OG_SITENAME || '' },
      { hid: 'theme-color', name: 'theme-color', content: process.env.SITE_THEME_COLOR || '' },
      { hid: 'msapplication-navbutton-color', name: 'msapplication-navbutton-color', content: process.env.SITE_MSAPP_NAVBTN_COLOR || '' },
      { hid: 'apple-mobile-web-app-status-bar-style', name: 'apple-mobile-web-app-status-bar-style', content: process.env.SITE_APPLE_WM_STATUSBAR_STYLE || '' },
      { hid: 'X-UA-Compatible', 'http-equiv': 'X-UA-Compatible', content: process.env.SITE_X_UA_Compatible || '' },
      { hid: 'google-site-verification', name:'google-site-verification', content: '' },
      { hid: 'enamad' , name: 'enamad' , content: process.env.ENAMAD_META},
      { hid: 'samandehi' , name: 'samandehi' , content: process.env.SAMANDEHI_META},
    ],
    link: [
      { rel: 'icon', type: 'image/x-icon', href: process.env.SITE_FAVICON },
      { rel: 'canonical', href: process.env.SITE_BASE_URL },
    ]
  },
  css: [
      '~/assets/scss/vuetify.scss',
      '~/assets/scss/style.scss',
      '@mdi/font/css/materialdesignicons.css',
      'font-awesome/css/font-awesome.min.css',
      '@fortawesome/fontawesome-free/css/all.css',
      '~/assets/scss/media.scss',
      '~/assets/scss/customization.scss',
      '~/assets/scss/sweetalert.scss',
      '~/assets/scss/noty.scss',
      '~/assets/scss/flipclock.scss',
      '~/assets/scss/sorting.scss',
      '~/assets/scss/cropper.scss',
      '~/assets/scss/transitions.scss',
      '~/assets/scss/product-zoom.scss',
      'swiper/css/swiper.css',
  ],
  plugins: [
      'plugins/mixins/reqerrors.js',
      'plugins/mixins/user.js',
      'plugins/mixins/language.js',
      'plugins/mixins/shopinfo.js',
      'plugins/mixins/formattedprice.js',
      'plugins/mixins/utils.js',
      'plugins/mixins/cms.js',
      'plugins/mixins/client.js',
      'plugins/mixins/cart.js',
      'plugins/axios.js',
      'plugins/veevalidate.js',
      'plugins/noty.js',
      '@plugins/vuedraggable',
      '@plugins/vuedraggable',
      {src: 'plugins/vuepersiandatepicker.js', mode: 'client'},
      {src: 'plugins/cropper.js', mode: 'client'},
      {src: 'plugins/vue-product-zoomer.js', mode: 'client'},
      {src: 'plugins/vueeditor.js', mode: 'client'},
      {src: 'plugins/nuxt-swiper-plugin.js', mode: 'client' }
  ],
  buildModules: [
    '@nuxtjs/dotenv',
    '@nuxtjs/vuetify',
    '@nuxtjs/device',
    'nuxt-gsap-module',
  ],
  modules: [
    '@nuxtjs/axios',
    '@nuxtjs/auth',
    ['vue-sweetalert2/nuxt',
      {
        confirmButtonColor: '#29BF12',
        cancelButtonColor: '#FF3333'
      }
    ],
    'cookie-universal-nuxt',
    '@nuxtjs/gtm',
    '@nuxtjs/google-gtag'
  ],

  device: {
    refreshOnResize: true
  },

  gtm: {
    id: process.env.GOOGLE_TAGS_ID,
    debug: false,
  },
  'google-gtag': {
    id: process.env.GOOGLE_ANALYTICS_ID,
    debug: false,
  },
  dotenv: {
    path: './'
  },
  gsap: {
    extraPlugins: {
      cssRule: false,
      draggable: false,
      easel: false,
      motionPath: false,
      pixi: false,
      text: false,
      scrollTo: false,
      scrollTrigger: false
    },
    extraEases: {
      expoScaleEase: false,
      roughEase: false,
      slowMo: true,
    }
  },
  axios: {
    baseURL: process.env.API_BASE_URL,
  },
  auth: {
      strategies: {
        local: {
          endpoints: {
            login: { url: 'auth/login', method: 'post', propertyName: 'token' },
            logout: { url: 'auth/logout', method: 'post' },
            user: { url: 'auth/info', method: 'get', propertyName: '' }
          }
        }
      },
      redirect: {
        login: '/login',
        home: '',
        logout: '/login'
      },
      cookie: {
        prefix: 'auth.',
        options: {
          path: '/',
          maxAge: process.env.AUTH_COOKIE_MAX_AGE
        }
      }
  },

  publicRuntimeConfig: {
    gtm: {
      id: process.env.GOOGLE_TAGS_ID
    },
    'google-gtag': {
      id: process.env.GOOGLE_ANALYTICS_ID,
    }
  },

  vuetify:{
    rtl: process.env.SITE_DIRECTION === 'rtl' ? true : false ,
    customVariables: ['~/assets/scss/variables_vuetify.scss'],
    breakpoint: {
      thresholds: {
        xs: 600,
        sm: 960,
        md: 1366,
        lg: 1920,
      },
    },
    icons: {
      iconfont: 'mdi',
    },
    treeShake: true,
    theme: {
      dark: false,
      themes: {
        dark: {
          primary: colors.blue.darken2,
          accent: colors.grey.darken3,
          secondary: colors.amber.darken3,
          info: colors.teal.lighten1,
          warning: colors.amber.base,
          error: colors.deepOrange.accent4,
          success: colors.green.accent3
        }
      }
    }
  },
  build: {
    transpile: ['vee-validate/dist/rules'],
    plugins: [
      new webpack.ProvidePlugin({
        '$': 'jquery',
        jQuery: "jquery",
        "window.jQuery": "jquery",
        '_': 'lodash'
      }),
      new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
    ],
    postcss: {
      preset: {
        features: {
          customProperties: false,
        },
      },
    },
    babel:{
      plugins: [
        ['@babel/plugin-proposal-private-methods', { loose: true }]
      ]
    },
    loaders: {
      scss: {
        additionalData: `
          $direction:${process.env.SITE_DIRECTION};
          $lang:${process.env.SITE_LANGUAGE};
          $theme_body_color:${process.env.THEME_BODY_COLOR};
          $theme_main_color:${process.env.THEME_MAIN_COLOR};
          $theme_main_color2:${process.env.THEME_MAIN_COLOR2};
          $theme_side_color:${process.env.THEME_SIDE_COLOR};
          $theme_side_color2:${process.env.THEME_SIDE_COLOR2};
          $theme_link_color:${process.env.THEME_LINK_COLOR};
        `
      }
    },
  }
}

package.json

{
  "name": "nuxt",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate"
  },
  "dependencies": {
    "@nuxtjs/auth": "^4.9.1",
    "@nuxtjs/axios": "^5.13.1",
    "@nuxtjs/device": "^2.1.0",
    "@nuxtjs/google-gtag": "^1.0.4",
    "@nuxtjs/gtm": "^2.4.0",
    "chart.js": "^2.9.3",
    "cookie-universal-nuxt": "^2.1.4",
    "core-js": "^3.9.1",
    "jquery": "^3.5.1",
    "nuxt": "2.15.4",
    "swiper": "^5.4.5",
    "v-viewer": "^1.5.1",
    "vee-validate": "^3.3.7",
    "vue-awesome-swiper": "^4.1.1",
    "vue-chartjs": "^3.5.0",
    "vue-cropperjs": "^4.1.0",
    "vue-easy-dnd": "^1.10.2",
    "vue-persian-datetime-picker": "^2.2.0",
    "vue-product-zoomer": "^3.0.1",
    "vue-sweetalert2": "^4.2.1",
    "vue2-editor": "^2.10.2",
    "vuedraggable": "^2.24.0"
  },
  "devDependencies": {
    "@fortawesome/fontawesome-free": "^5.15.1",
    "@mdi/font": "^5.9.55",
    "@nuxtjs/dotenv": "^1.4.1",
    "@nuxtjs/vuetify": "1.11.3",
    "flipclock": "^0.10.8",
    "font-awesome": "^4.7.0",
    "noty": "^3.2.0-beta",
    "nuxt-gsap-module": "^1.2.1",
    "sass": "1.32.13"
  }
}

【问题讨论】:

  • 您的应用托管在哪里/如何托管?
  • nuxt.config.js 中有一些问题需要解决,您的问题可能来自缓存问题。
  • 我的问题是因为pm2 :| ......!它并没有阻止前一个!顺便说一句,很高兴知道!我的配置有什么问题??

标签: vue.js webpack nuxt.js


【解决方案1】:

nuxt.config.js 配置中可能会改进的一些事情:

  • const env = require('dotenv').config() 不需要,因为它已经被烘焙到 Nuxt 中
  • 不是问题而是样式,使用es6 template literals进行插值,更易读
  • 您的 google-site-verification 是硬编码的,可能不需要
  • 您的css 属性中确实有很多东西,我很确定您不需要每一页上的所有东西。因此,您可以仅在需要时调用它们,并拥有一个 global.scss 文件,以使其对剩余(强制性)全局 CSS 更加有序
  • plugins 也是如此,那里有很多东西(@plugins/vuedraggable 写了两次)
  • mixins 不应该在 plugins 中,而是按组件加载,实际上在 Vue3 中已弃用
  • @nuxtjs/dotenv 应该从 buildModulespackage.json 中删除
  • 您应该删除gsap 键中的一些选项,因为default options 已经是您要传递的选项,只需保留slowMo
  • axios 应使用 runtimeConfigs 进行配置,如下所述:https://stackoverflow.com/a/67983038/8816585
  • 您的auth 密钥可能与auth/login 之类的URL 一起使用,但我可能可以肯定这对于/auth/login 之类的东西没问题
  • vuetify 的 RTL 由环境变量决定?应该是动态的并且取决于 HTML IMO
  • plugin-proposal-private-methods 是一个非常丑陋的修复,it was fixed at 2.15.5because of security reasons,我宁愿将其更新为2.15.7
  • 不确定什么是 scss 加载器,但我认为这可以通过“CSS 变量”实现动态
  • 我不确定您实际上是如何加载 lodash,我只是希望您在实际上只使用几种方法时不要带上整个库
  • 当然,在我看来,我会在使用 Vue 时完全放弃 jQuery,因为在使用这个框架时它根本没有用处。

【讨论】:

  • 大量的人!一些问题:1-你说要删除 dotenv 包? Nuxt 会立即读取我的.env 文件吗? 2-关于css和插件,是否会导致负载过重? (其实是新手错误)。关于 loadash 和 jQuery,是的,应该删除它们,因为它们从未使用过!他们从我的应用程序开始就在那里!最后一件事;我的 mixins 更像是我可以在项目中的任何地方使用的实用程序,所以我在全局范围内声明它们(所以我的 scss),你说最好只在需要时使用,因为初始化负载很重?以及 Vue3 中的 mixins 发生了什么?
  • 1.是的,就是这样。 2. cssplugins 中的所有内容都将在您的 Nuxt 应用程序的开头加载(因此它可以减慢页面的初始加载时间),并且将在全球范围内可用。如果您只在结帐页面上使用,那么加载整个 8kB 的幻灯片 CSS 是多余的。而是在您到达那里时加载它(没问题,您可以成为 Nuxt 人的新手)。您可以按需加载每个 SCSS mixins(style 部分)。它被弃用的原因有很多:v3.vuejs.org/guide/mixins.html#drawbacks
  • 我知道样式部分。我所有的主要风格都在 style.scss 。我在我的新主题中将它们分开,但旧主题是........ !!实际上我这样做是出于维护原因,但现在它会杀了我! XD
  • 你好。最后一个问题。正如你提到的,nuxt 现在有一个内置的 dotenv。所以我可以删除dotenv 包。有没有像dotenv这样更改.env文件路径??正如您在我的 nuxt.config.js 中看到的,有一个 env:{path: './'} 选项。
  • @MojtabaBarari 你的意思是改变路径还是只保留./
猜你喜欢
  • 2018-12-26
  • 1970-01-01
  • 2014-09-20
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 2019-02-04
  • 1970-01-01
相关资源
最近更新 更多