无法在 Vercel 上使用 serverSideTranslations

Posted

技术标签:

【中文标题】无法在 Vercel 上使用 serverSideTranslations【英文标题】:Can not use serverSideTranslations on Vercel 【发布时间】:2021-12-06 22:46:50 【问题描述】:

在我的索引页面中,我使用了serverSideTranslations 函数。获取有关查找翻译文件的错误。 此错误仅发生在 serverSideTranslations 使用的页面上。

我部署到 Vercel 和 Netlify。在他们两个我都有同样的错误。

_app.js 中,我使用的是appWithTranslation

依赖关系:

"dependencies": 
    "@fortawesome/fontawesome-free": "^5.15.4",
    "@netlify/plugin-nextjs": "^3.9.2",
    "axios": "^0.21.1",
    "bootstrap": "^4.6.0",
    "dayjs": "^1.10.4",
    "dotenv": "^8.2.0",
    "fs-extra": "^10.0.0",
    "is-mobile": "^3.0.0",
    "next": "^11.1.2",
    "next-i18next": "^8.9.0",
    "next-seo": "^4.20.0",
    "node-fetch": "^2.6.1",
    "parse": "^3.1.0",
    "react": "17.0.1",
    "react-bootstrap": "^1.5.0",
    "react-dom": "17.0.1",
    "react-infinite-scroller": "^1.2.4",
    "recoil": "^0.1.2",
    "sass": "^1.43.2",
    "ts-node": "^9.1.1"
  

next.config.js

const path = require('path');
const  PHASE_DEVELOPMENT_SERVER  = require('next/constants')
const i18NextConfig = require('./next-i18next.config');

const prodConfig = 
    generateBuildId: () => 'build-id',
    compress: true,
    target: 'serverless',
    i18n: i18NextConfig.i18n,
    sassOptions: 
        includePaths: [path.join(__dirname, 'styles')],
    ,

module.exports = (phase,  defaultConfig ) => 
    if (phase === PHASE_DEVELOPMENT_SERVER) 
        return 
            ...defaultConfig,
            ...prodConfig,
            compress: false,
        
    

    return prodConfig;


next-i18next.config.js

const path = require('path');

module.exports = 
  i18n: 
    defaultLocale: 'he',
    locales: ['he'],
    localePath: path.resolve('./locales'), // <<< i tried to put this line here
  ,
  keySeparator: '>',
  nsSeparator: '|',
  reloadOnPrerender: false,
  localePath: path.resolve('./locales'), // <<< and also here
;

来自 Vercel lambda 函数的错误消息

ng 请求:错误:ENOENT:没有这样的文件或目录,scandir '/var/task/public/locales/he' 在 Object.readdirSync (fs.js:1043:3) 在 getLocaleNamespaces (/var/task/node_modules/next-i18next/dist/commonjs/config/createConfig.js:175:23) 在 /var/task/node_modules/next-i18next/dist/commonjs/config/createConfig.js:181:20 在 Array.map() 在 getNamespaces (/var/task/node_modules/next-i18next/dist/commonjs/config/createConfig.js:180:44) 在 createConfig (/var/task/node_modules/next-i18next/dist/commonjs/config/createConfig.js:221:29) 在 _callee$ (/var/task/node_modules/next-i18next/dist/commonjs/serverSideTranslations.js:199:53) 在 tryCatch (/var/task/node_modules/regenerator-runtime/runtime.js:63:40) 在 Generator.invoke [as _invoke] (/var/task/node_modules/regenerator-runtime/runtime.js:294:22) 在 Generator.next (/var/task/node_modules/regenerator-runtime/runtime.js:119:21) 错误号:-2, 系统调用:'scandir', 路径:'/var/task/public/locales/he'

【问题讨论】:

【参考方案1】:

您应该修改项目中的 next-i18next.config.js 文件,并将 path.resolve 添加到语言环境路径。你可以在this repo 中看到一个例子。确保您知道您的语言环境文件夹所在的位置,并编写正确的路径。 这个问题的答案在thisgithub线程中找到。

【讨论】:

如 repo 所示,getStaticProps 通常没有问题。曾经(现在仍然是)一个问题是 getServerSideProps 的行为 - 那是事情真正变得混乱的时候。 - 捆绑包中不包含语言环境的问题。我目前正在研究如何强制 Vercel 捆绑这些文件...

以上是关于无法在 Vercel 上使用 serverSideTranslations的主要内容,如果未能解决你的问题,请参考以下文章

环境变量不适用于带有 Nuxt 的 Vercel

无法在 vercel 生产中验证 spotify

使用 serverSide 后,带有 Ajax 的 DataTable 无法正常工作:true

gatsby 无法获取所有关于 vercel 生产的 graphql 数据

/tmp/chromium:加载共享库时出错:libnss3.so:无法打开共享对象文件:没有这样的文件或目录 Vercel

是否可以根据用户代理(设备类型)在 vercel 上使用 nextjs 提供不同版本的静态页面?