javascript - Wie setzt man den basePath für eine statisch exportierte NextJS-App
Ich muss eine React/NextJS-App auf einem Weblogic J2EE-Server mit einem bestimmten Kontext erstellen und bereitstellen. Ich habe etwas Erfahrung mit React, aber ich mache meine ersten Schritte mit NextJS.
Derzeit sind die Build-/Verifikationsschritte;
Erstelle eine Vanilla-NextJS-App
Fügen Sie eine
next.config.jsmit einemmodule.exporthinzu, um den Basis-Pfad zu ändernmodule.exports={ basePath: '/test' }
Führen Sie
npm run devaus, die Anwendung ist unter 'http://localhost:3000/test' verfügbarFügen Sie dem package.json ein Export-Skript
"export": "next build && next export"hinzu, um den statischen Export zu unterstützenFügen Sie den unten stehenden Export hinzu, um das Problem 21079 zu lösen
//https://github.com/vercel/next.js/issues/21079 module.exports = { images: { loader: "imgix", path: "", } }
Führte
npm run exportaus, um einen statischen HTML-Export zu erstellen. Der Export wurde erfolgreich imout-Ordner abgeschlossen. Beim Überprüfen derindex.htmlimout-Ordner beginnen alle Verweise auf den statischen Inhalt immer noch mit/_next/staticund nicht mit/test/_next/static.Also kann dies ein Missverständnis meinerseits sein, bitte korrigieren Sie mich, wenn ich hier falsch liege.
Um die Vanilla-App auf dem J2EE-Anwendungsserver testen zu können, muss sie in eine WAR-Datei gepackt werden. Um dies zu erreichen, habe ich die Datei
warpack/warpack.tszum Projekt hinzugefügt.
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);
};
});Die erforderlichen Pakete für
webpack.tsinstalliertnpm install fs --save-dev npm install rimraf --save-dev npm install archiver --save-dev
Das Skript
"warpack": "next build && next export && node warpack/warpack.ts"hinzugefügt, um die statische App zu bauen, zu exportieren und in ein War zu verpacken.Nach der Bereitstellung der War-Datei kann die Seite unter
http://something/testgeladen werden, zeigt jedoch eine leere Seite an. Die Netzwerk-Entwicklungstools zeigen, dass die Anfragen an den Root des Anwendungsservers und nicht an den konfigurierten Basis-Pfad gesendet werden.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)
Antwort #1
Sie können die env-Prüfung verwenden, um nur für die prod-Umgebung aufzurufen, wenn Sie möchten, zum Beispiel:
module.exports = {
basePath: "/test"
assetPrefix: process.env.NODE_ENV === "production" ? "/test/" : undefined,
}
Antwort #2
Zu viel Fokus auf den basePath-Wert statt auf die korrekte Syntax von next.config.js. Der zweite Module-Export in next.config.js überschrieb den ersten.
Falsch
module.exports = {
basePath: '/test'
}
//https://github.com/vercel/next.js/issues/21079
module.exports = {
images: {
loader: "imgix",
path: "",
}
}
Korrekt
module.exports = {
basePath: '/test',
assetPrefix: "/test/",
//https://github.com/vercel/next.js/issues/21079
images: {
loader: "imgix",
path: ""
}
}
