javascript - Ako nastaviť basePath pre staticky exportovanú aplikáciu NextJS
Potrebujem vytvoriť a nasadiť aplikáciu React/NextJS na server Weblogic J2ee s konkrétnym kontextom. Mám nejaké skúsenosti s React, ale s NextJS začínam.
Momentálne sú kroky zostavenia/overenia:
Vytvorte vanilla NextJS aplikáciu
Pridajte súbor
next.config.jssmodule.exportna zmenu základnej cestymodule.exports={ basePath: '/test' }
Spustite
npm run dev, aplikácia je dostupná na 'http://localhost:3000/test'Pridajte do súboru package.json exportovací skript
"export": "next build && next export"pre podporu statického exportuPridajte export nižšie na vyriešenie problému 21079
//https://github.com/vercel/next.js/issues/21079 module.exports = { images: { loader: "imgix", path: "", } }
Spustené
npm run exportna vytvorenie statického HTML exportu. Export bol úspešne dokončený do zložkyout. Pri kontroleindex.htmlv zložkeoutvšetky odkazy na statický obsah stále začínajú/_next/statica nie/test/_next/static.Takže toto môže byť z mojej strany nesprávne pochopenie, prosím opravte ma, ak sa mýlim.
Aby bolo možné otestovať vanilla aplikáciu na J2EE aplikačnom serveri, musí byť zabalená do súboru war. Na dosiahnutie tohto som do projektu pridal súbor
warpack/warpack.ts.
const fs = require('fs');
const archiver = require('archiver');
const rimraf = require('rimraf') ;
const distFolder = 'dist' ;
const warFile = distFolder + '/test.war';
const buildFolder = 'out';
const contextRoot = 'test';
// Destroy dist folder
rimraf(distFolder, (error) => {
if (!error) {
// Create dist folder
if (!fs.existsSync(distFolder)){
fs.mkdirSync(distFolder);
}
const output = fs.createWriteStream(warFile);
const archive = archiver('zip', {});
output.on('close', () => {
console.log('war (' + warFile + ') ' + archive.pointer() + ' total bytes');
});
// write archive to output file
archive.pipe(output);
// add build folder to archive
archive.directory(buildFolder,'');
// add weblogic.xml
const weblogicXML = '<?xml version="1.0" encoding="UTF-8"?><weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.2/weblogic-web-app.xsd"><weblogic-version>10.3.6</weblogic-version><context-root>' + contextRoot '</context-root><description>Test NextJS</description></weblogic-web-app>'
archive.append(weblogicXML,{ name: 'WEB-INF/weblogic.xml' });
const manifestMF = 'Manifest-Version: 1.0\nBuild-Tag: 0.0.1-SNAPSHOT\nWeblogic-Application-Version: 0.0.1-SNAPSHOT';
archive.append(manifestMF,{ name: 'META-INF/MANIFEST.MF' });
archive.finalize();
} else {
console.log('Failed to delete "' + distFolder + '" folder.') ;
process.exit(1);
};
});Nainštalované potrebné balíky pre
webpack.tsnpm install fs --save-dev npm install rimraf --save-dev npm install archiver --save-dev
Pridaný skript
"warpack": "next build && next export && node warpack/warpack.ts"na zostavenie, export a zabalenie statickej aplikácie do war.Po nasadení war-súboru je stránka možné načítať na
http://something/test, ale zobrazuje sa prázdna stránka. Nástroje pre vývoj sieťových aplikácií naznačujú, že požiadavky sú smerované na koreň aplikačného servera, nie na nakonfigurovanú základnú cestu.GET http://host:8001/static/css/main.09371e9d.chunk.css net::ERR_ABORTED 404 (Not Found) GET http://host/static/js/2.0850eeb7.chunk.js net::ERR_ABORTED 404 (Not Found) GET http://host/static/js/main.dc0c945b.chunk.js net::ERR_ABORTED 404 (Not Found)
Odpoveď č. 1
Môžete použiť kontrolu env, aby ste ju vyvolali iba pre prostredie prod, ak chcete, napríklad:
module.exports = {
basePath: "/test"
assetPrefix: process.env.NODE_ENV === "production" ? "/test/" : undefined,
}
Odpoveď č. 2
Príliš veľký dôraz na hodnotu basePath namiesto správnej syntaxe súboru next.config.js. Druhý export modulu v next.config.js prepísal ten prvý.
Nesprávne
module.exports = {
basePath: '/test'
}
//https://github.com/vercel/next.js/issues/21079
module.exports = {
images: {
loader: "imgix",
path: "",
}
}
Správne
module.exports = {
basePath: '/test',
assetPrefix: "/test/",
//https://github.com/vercel/next.js/issues/21079
images: {
loader: "imgix",
path: ""
}
}
