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.js module.export-tiedoston kanssa peruspolun muuttamiseksi

    module.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 export luomaan staattinen HTML-vienti. Vienti on onnistuneesti valmis out-kansioon. Kun tarkastellaan index.html-tiedostoa out-kansiossa, kaikki viittaukset staattiseen sisältöön alkavat edelleen /_next/static eikä /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.ts projektiin.

    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.ts

    npm 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: ""
  }

}