javascript - Cara mengatur basePath untuk aplikasi NextJS yang diekspor secara statis
Saya perlu membangun dan menyebarkan aplikasi React/NextJS ke server Weblogic J2ee dengan konteks tertentu. Saya memiliki pengalaman dengan React, tetapi baru memulai dengan NextJS.
Saat ini langkah-langkah build/verifikasi adalah;
Buat aplikasi NextJS vanilla
Tambahkan
next.config.jsdenganmodule.exportuntuk mengubah basepathmodule.exports={ basePath: '/test' }
Jalankan
npm run devaplikasi tersedia di 'http://localhost:3000/test'Tambahkan skrip ekspor ke package.json
"export": "next build && next export"untuk mendukung ekspor statisTambahkan ekspor di bawah ini untuk menyelesaikan masalah 21079
//https://github.com/vercel/next.js/issues/21079 module.exports = { images: { loader: "imgix", path: "", } }
Menjalankan
npm run exportuntuk membuat ekspor HTML statis. Ekspor berhasil diselesaikan ke folderout. Saat memeriksaindex.htmldi folderout, semua referensi ke konten statis masih dimulai dengan/_next/staticdan bukan dengan/test/_next/static.Jadi ini bisa menjadi salah tafsir dari pihak saya, harap koreksi saya jika saya salah di sini.
Untuk bisa menguji aplikasi vanilla di server aplikasi J2EE, aplikasi tersebut harus dikemas menjadi file war. Untuk mewujudkan ini, saya menambahkan file
warpack/warpack.tske dalam proyek.
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);
};
});Menginstal paket yang diperlukan untuk
webpack.tsnpm install fs --save-dev npm install rimraf --save-dev npm install archiver --save-dev
Menambahkan skrip
"warpack": "next build && next export && node warpack/warpack.ts"untuk membangun, mengekspor, dan membungkus aplikasi statis ke dalam sebuah war.Setelah penyebaran berkas perang, halaman dapat dimuat di
http://something/testtetapi menampilkan halaman kosong. Alat pengembang jaringan menunjukkan bahwa permintaan dilakukan ke root dari server aplikasi, bukan ke basepath yang dikonfigurasi.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)
Jawaban #1
Anda dapat menggunakan env untuk memeriksa agar hanya dijalankan pada lingkungan prod jika Anda ingin seperti:
module.exports = {
basePath: "/test"
assetPrefix: process.env.NODE_ENV === "production" ? "/test/" : undefined,
}
Jawaban #2
Terlalu fokus pada nilai basePath daripada pada sintaks yang benar dari next.config.js. Ekspor modul kedua di next.config.js menimpa yang pertama.
Salah
module.exports = {
basePath: '/test'
}
//https://github.com/vercel/next.js/issues/21079
module.exports = {
images: {
loader: "imgix",
path: "",
}
}
Benar
module.exports = {
basePath: '/test',
assetPrefix: "/test/",
//https://github.com/vercel/next.js/issues/21079
images: {
loader: "imgix",
path: ""
}
}
