javascript - Kuinka asettaa basePath staattisesti viedylle NextJS-sovellukselle
Minun täytyy rakentaa ja ottaa käyttöön React/NextJS -sovellus Weblogic J2ee -palvelimelle tietyllä kontekstilla. Minulla on jonkin verran React-kokemusta, mutta otan ensimmäisiä askeleitani NextJS:n kanssa.
Tällä hetkellä rakennus/tarkastusvaiheet ovat;
Luo perus NextJS-sovellus
Lisää
next.config.jsmodule.export-tiedoston kanssa peruspolun muuttamiseksimodule.exports={ basePath: '/test' }
Suorita
npm run dev, sovellus on saatavilla osoitteessa 'http://localhost:3000/test'Lisää paketti.json-tiedostoon vientiskripti
"export": "next build && next export"tukeaksesi staattista vientiäLisää alla oleva vienti ratkaistaksesi ongelman 21079
//https://github.com/vercel/next.js/issues/21079 module.exports = { images: { loader: "imgix", path: "", } }
Suoritettu
npm run exportluomaan staattinen HTML-vienti. Vienti on onnistuneesti valmisout-kansioon. Kun tarkastellaanindex.html-tiedostoaout-kansiossa, kaikki viittaukset staattiseen sisältöön alkavat edelleen/_next/staticeikä/test/_next/static.Joten tämä voi olla minun puoleltani väärinymmärrys, korjatkaa minut, jos olen tässä väärässä.
Jotta voitiin testata tavallista sovellusta J2EE-sovelluspalvelimella, se täytyy pakata war-tiedostoksi. Tämän saavuttamiseksi lisäsin tiedoston
warpack/warpack.tsprojektiin.
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);
};
});Asensi vaaditut paketit tiedostolle
webpack.tsnpm install fs --save-dev npm install rimraf --save-dev npm install archiver --save-dev
Lisättiin skripti
"warpack": "next build && next export && node warpack/warpack.ts"rakentamaan, viemään ja pakkaamaan staattinen sovellus war-tiedostoksi.Sodan tiedoston käyttöönoton jälkeen sivu voidaan ladata osoitteessa
http://something/test, mutta se näyttää tyhjältä sivulta. Verkko-kehitystyökalut osoittavat, että pyynnöt tehdään sovelluspalvelimen juureen, eivät määritettyyn peruspolkuun.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)
Vastaus #1
Voit käyttää env-tarkistusta kutsuaksesi vain prod-ympäristölle, jos haluat, kuten:
module.exports = {
basePath: "/test"
assetPrefix: process.env.NODE_ENV === "production" ? "/test/" : undefined,
}
Vastaus #2
Liiallinen keskittyminen basePath-arvoon sen sijaan, että keskityttäisiin next.config.js-tiedoston oikeaan syntaksiin. Toinen moduulin vienti next.config.js-tiedostossa kirjoitti ensimmäisen yli.
Väärin
module.exports = {
basePath: '/test'
}
//https://github.com/vercel/next.js/issues/21079
module.exports = {
images: {
loader: "imgix",
path: "",
}
}
Oikein
module.exports = {
basePath: '/test',
assetPrefix: "/test/",
//https://github.com/vercel/next.js/issues/21079
images: {
loader: "imgix",
path: ""
}
}
