astro-i18next引起的无法编译的问题
这个问题困扰了我两天,根本原因是i18next
插件没有同步删除生成出来的language code
命名的路由文件夹导致的错误,在dev模式下都是正常的,但是build
无论是SSR还是SSG都不行。
具体过程是,原本是一个article
目录下存放了[slug].astro
文件,后来觉得用动态路由做SEO更友好,于是把article
重命名为[category]
,但是在用npx astro-i18next generate
命令生成出语言相对应子目录的时候它直接生成出[category]
目录,而原有的article目录依旧存在,于是就有了下面的错误,翻遍全网都没解决,最后逐一排查才发现在这个地方翻车了。
另外关于astro-18next的问题很多,几个吐槽的地方是:
1. 每次使用npx astro-i18next generate
它会整段删除注释/**/
中的内容,这个务必要注意
2. 如果你的i18next引入方式是两行,类似于这样
import { t, changeLanguage } from "i18next"; import i18next from "i18next";
在使用了generate命令后它会变成
import { t, changeLanguage } from "i18next"; import i18next, {changeLanguage} from "i18next";
这样一来就出现了重复引入的提示,所以还得这样写:
import i18next, { t, changeLanguage } from "i18next";
3. ssg渲染在dev模式下无法直接预览效果
build的内容是没问题的,但是在yarn dev模式下切换语言会出现语言没有变化的情况。
最后是出错的LOG:
X [ERROR] Could not resolve "url" dist/$server_build/chunks/pages/_slug_.astro.775b480a.mjs:2:22: 2 │ import * as url2 from 'url'; ╵ ~~~~~ The package "url" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "module" dist/$server_build/chunks/pages/_slug_.astro.775b480a.mjs:7:20: 7 │ import module2 from 'module'; ╵ ~~~~~~~~ The package "module" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "path" dist/$server_build/chunks/pages/_slug_.astro.775b480a.mjs:8:18: 8 │ import path2 from 'path'; ╵ ~~~~~~ The package "path" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "fs" node_modules/tsm/require.js:1:41: 1 │ "use strict";const{readFileSync}=require("fs"),{extname}=require("path"),tsm=require("./utils"),loadJS=require.extensions[".js"];let esbuild,env=tsm.$defaults("cjs"),uconf=env.file&&require(env.file),config=tsm.$finaliz... ╵ ~~~~ The package "fs" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "path" node_modules/@proload/core/lib/esm/index.mjs:2:48: 2 │ import { join, dirname, extname, resolve } from "path"; ╵ ~~~~~~ The package "path" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "path" node_modules/tsm/require.js:1:65: 1 │ "use strict";const{readFileSync}=require("fs"),{extname}=require("path"),tsm=require("./utils"),loadJS=require.extensions[".js"];let esbuild,env=tsm.$defaults("cjs"),uconf=env.file&&require(env.file),config=tsm.$finaliz... ╵ ~~~~~~ The package "path" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "fs" node_modules/i18next-fs-backend/esm/fs.cjs:2:18: 2 │ var f = require('fs') │ ~~~~ ╵ "./fs" The package "fs" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "fs" node_modules/@proload/core/lib/esm/index.mjs:5:52: 5 │ import { existsSync, readdir, readFile, stat } from "fs"; ╵ ~~~~ The package "fs" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "path" node_modules/tsm/utils.js:1:36: 1 │ "use strict";const{resolve}=require("path"),{existsSync}=require("fs");exports.$defaults=function(l){let{FORCE_COLOR:e,NO_COLOR:s,NODE_DISABLE_COLORS:o,TERM:t}=process.env,i=process.argv.slice(2),n=new Set(i),f=n.has("-... ╵ ~~~~~~ The package "path" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "util" node_modules/@proload/core/lib/esm/index.mjs:6:26: 6 │ import { promisify } from "util"; ╵ ~~~~~~ The package "util" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "path" node_modules/i18next-fs-backend/esm/path.cjs:2:21: 2 │ var path = require('path') │ ~~~~~~ ╵ "./path" The package "path" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "fs" node_modules/tsm/utils.js:1:65: 1 │ "use strict";const{resolve}=require("path"),{existsSync}=require("fs");exports.$defaults=function(l){let{FORCE_COLOR:e,NO_COLOR:s,NODE_DISABLE_COLORS:o,TERM:t}=process.env,i=process.argv.slice(2),n=new Set(i),f=n.has("-... ╵ ~~~~ The package "fs" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "fs" node_modules/tsm/node_modules/esbuild/lib/main.js:1672:17: 1672 │ var fs = require("fs"); ╵ ~~~~ The package "fs" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "module" node_modules/@proload/core/lib/esm/index.mjs:7:30: 7 │ import { createRequire } from "module"; ╵ ~~~~~~~~ The package "module" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "os" node_modules/tsm/node_modules/esbuild/lib/main.js:1673:17: 1673 │ var os = require("os"); ╵ ~~~~ The package "os" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "path" node_modules/escalade/dist/index.mjs:1:33: 1 │ import { dirname, resolve } from 'path'; ╵ ~~~~~~ The package "path" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "module" node_modules/@proload/core/lib/esm/requireOrImport.mjs:2:30: 2 │ import { createRequire } from 'module'; ╵ ~~~~~~~~ The package "module" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "path" node_modules/tsm/node_modules/esbuild/lib/main.js:1674:19: 1674 │ var path = require("path"); ╵ ~~~~~~ The package "path" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "fs" node_modules/escalade/dist/index.mjs:2:30: 2 │ import { readdir, stat } from 'fs'; ╵ ~~~~ The package "fs" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "url" node_modules/@proload/core/lib/esm/requireOrImport.mjs:3:30: 3 │ import { pathToFileURL } from 'url'; ╵ ~~~~~ The package "url" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "util" node_modules/escalade/dist/index.mjs:3:26: 3 │ import { promisify } from 'util'; ╵ ~~~~~~ The package "util" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "child_process" node_modules/tsm/node_modules/esbuild/lib/main.js:1856:28: 1856 │ var child_process = require("child_process"); ╵ ~~~~~~~~~~~~~~~ The package "child_process" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "crypto" node_modules/tsm/node_modules/esbuild/lib/main.js:1857:21: 1857 │ var crypto = require("crypto"); ╵ ~~~~~~~~ The package "crypto" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. X [ERROR] Could not resolve "tty" node_modules/tsm/node_modules/esbuild/lib/main.js:1861:18: 1861 │ var tty = require("tty"); ╵ ~~~~~ The package "tty" wasn't found on the file system but is built into node. Are you trying to bundle for node? You can use "platform: 'node'" to do that, which will remove this error. error Could not resolve "url" File: dist/$server_build/chunks/pages/_slug_.astro.775b480a.mjs:2:22 Code: 1 | import i18next, { t, changeLanguage } from 'i18next'; > 2 | import * as url2 from 'url'; | ^ 3 | import '@proload/core'; 4 | import '@proload/plugin-tsm'; 5 | import { c as createAstro, a as createComponent, r as renderTemplate, m as maybeRenderHead, b as renderSlot, d as renderComponent, u as unescapeHTML, F as Fragment, s as spreadAttributes, e as addAttribute, f as renderHead } from '../astro.fe20a6e7.mjs'; error Command failed with exit code 1.