React + TypeScript ที่มีปัญหาการปรับใช้เราเตอร์บนหน้า Github

Local ทำงานได้ดี แต่เมื่อรันบน "npm run release" เว็บไซต์จะส่งคืน 404

ฉันมีแอป React + TypeScript ซึ่งใช้ react-router-dom BrowserRouter เพื่อนำทางระหว่างหน้าต่างๆ

ฉันทราบปัญหาในหน้า github ที่มี react-router ดังนั้นฉันจึงได้ลองเพิ่ม basename={process.env.PUBLIC_URL} เปลี่ยนเป็น HashRouter และความเป็นไปได้อื่นๆ อีกมากมาย ฉันแก้ไขปัญหานี้มาเป็นเวลา 7 ชั่วโมงติดต่อกันแล้ว... และดูเหมือนว่าจะไม่มีแหล่งข้อมูลเกี่ยวกับปัญหานี้สำหรับ Typescript

ใครก็ได้โปรดช่วยฉันด้วย!

ดัชนี.tsx

ReactDOM.render(
  <AppRouter />,
  document.getElementById('root') as HTMLElement
);

เราเตอร์.tsx

export const AppRouter: React.StatelessComponent<{}> = () => {

return (

    <BrowserRouter basename={process.env.PUBLIC_URL}>
        <div>
            <NavBar />
            <Switch>
                <Route exact={true} path='/' component={App} />
                <Route exact={true} path='/' component={Notes} />
                <Route exact={true} path='/About' component={About} />
            </Switch>  
        </div>
    </BrowserRouter>
);

ลอง Router.tsx ด้วย

export const AppRouter: React.StatelessComponent<{}> = () => {

return (

    <HashRouter>
        <div>
            <NavBar />
            <Switch>
                <Route exact={true} path='/' component={App} />
                <Route exact={true} path='/' component={Notes} />
                <Route exact={true} path='/About' component={About} />
            </Switch>  
        </div>
    </HashRouter>
);

NavBar.tsx

export const NavBar: React.StatelessComponent<{}> = () => {

return (
    <div id='nav-bar'>
        <AppBar position='static' color='default'>
            <Toolbar>
                <span id='navbar-title'>
                    <Typography variant='title' color='default'>
                        Keep
                    </Typography>
                </span>
                <Link to="/">
                    <Button size="large" color="primary" variant="text">Notes</Button>
                </Link>
                <Link to="/About">
                    <Button size="large" color="primary" variant="text">About</Button>
                </Link>
            </Toolbar>
        </AppBar>
    </div>
)

ขอบคุณสำหรับการอ่าน.

แก้ไขด้านล่างคือการตอบสนองข้อผิดพลาดที่แน่นอนจากเว็บคอนโซลที่ข้อผิดพลาด 404 บางอย่างเกี่ยวกับ favicon นั่นอาจเป็นปัญหาหรือไม่ ที่ตั้งผิดอย่างสิ้นเชิง

json469.github.io/:1 Refused to load the image 'https://json469.github.io/favicon.ico' because it violates the following Content Security Policy directive: "img-src data:".

ฉันได้ลองแก้ไขจุดบกพร่องด้วยการพิมพ์ process.env.PUBLIC_URL แต่มันส่งคืนสตริงว่าง ...

แก้ไข 2 ด้านล่างคือการเปลี่ยนแปลงที่เกิดขึ้นกับ Router.tsx ซึ่งแก้ไขปัญหาได้

    <HashRouter>
        <div>
            <NavBar />
                <main>
                    <Switch>
                        <Route exact={true} path='/' component={App} />
                        <Route exact={true} path='/' component={Notes} />
                        <Route exact={true} path='/About' component={About} />
                    </Switch>
                </main>
        </div>
    </HashRouter>

person Jesse    schedule 13.11.2018    source แหล่งที่มา


คำตอบ (1)


ไม่น่าจะเกิดจาก TypeScript - หรือแม้แต่ React Router หากคุณได้รับ 404 นั่นเป็นเพราะเซิร์ฟเวอร์ของคุณจะต้องเปลี่ยนเส้นทางผู้ใช้ไปยังแอป React ของคุณ หากพวกเขาเยี่ยมชมเส้นทางที่เซิร์ฟเวอร์ไม่ทราบ และแอปของคุณจะสามารถแกล้งทำเป็นกำหนดเส้นทางจริงได้

อย่างไรก็ตาม ปรากฏว่า GitHub Pages ไม่รองรับสิ่งนี้ ดังนั้นคุณไม่สามารถทำ URL ที่ "เหมาะสม" เช่น username.github.io/page/some-route วิธีแก้ปัญหาคือใช้ Hash Router ดังที่คุณพูดถึง แต่นั่นหมายความว่า URL จะมีลักษณะเป็นชื่อผู้ใช้.github.io/page#/some-route

ดังนั้น ปัญหาของคุณน่าจะเป็นว่าคุณกำลังลองใช้เส้นทางเดิม แทนที่จะเป็นเส้นทางหลัง ดังนั้น ในการแก้ปัญหา คุณสามารถลองใช้เส้นทางประเภทนั้นหรือย้ายไปยังโฮสต์อื่นก็ได้

person Vincent    schedule 13.11.2018
comment
ขอขอบคุณสำหรับการระบุปัญหา! ฉันลองใช้ HashRoute แล้ว แต่ก็ยังไม่มีโชค ฉันต้องเปลี่ยนอะไรเพิ่มเติมจากรหัส Router.tsx ตัวที่สองหรือไม่ นั่นเป็นวิธี HashRoute ที่ฉันลองแล้ว แต่ยังคงได้ 404 :( - person Jesse; 14.11.2018
comment
@Jesse มันจะช่วยได้ถ้าคุณสามารถแสดงให้เราเห็นว่าคุณลองใช้เส้นทางใดที่ทำให้คุณได้รับ 404 หากคุณใช้ HashRouter อย่างน้อยที่สุดคุณควรจะจบลงที่หน้าดัชนีของคุณ ไม่ใช่หน้า GitHub 404 - person Vincent; 15.11.2018
comment
@Jesse โอ้ ฉันเพิ่งเห็นการแก้ไขของคุณ หากคุณเห็นเฉพาะ 404 ในคอนโซลของคุณ นั่นเป็นเพราะเบราว์เซอร์พยายามดึงข้อมูล /favicon.ico โดยอัตโนมัติหากไม่มีการกำหนดไว้ - ไม่ต้องกังวล หากคุณต้องการทราบข้อมูลเพิ่มเติม โปรดดูที่ en.wikipedia.org/wiki/Favicon ตอนนี้ ว่าคุณโพสต์ชื่อผู้ใช้ GitHub ของคุณด้วย แต่ฉันเห็นว่าแอปของคุณไม่ได้อยู่บน GitHub เช่นกัน: github.com/json469/json469.github.io คุณช่วยแสดง package.json และผลลัพธ์เมื่อคุณรัน npm run deploy ได้ไหม - person Vincent; 15.11.2018
comment
การปรับปรุงปัญหาภายนอก TS ถือเป็นการเริ่มต้นที่ดีสำหรับฉัน! ฉันจัดการเพื่อเริ่มต้นใหม่และทำให้มันใช้งานได้กับ HashRoute ฉันเชื่อว่าความผิดเกิดขึ้นกับฉันเมื่อฉันซ้อน HashRoute อย่างไม่ถูกต้อง ฉันได้อัปเดตการเปลี่ยนแปลงที่ทำให้ใช้งานได้แล้ว ขอบคุณสำหรับความช่วยเหลือของคุณ :) - person Jesse; 16.11.2018
comment
ดีใจที่ได้ยินว่าคุณแก้ไขมันได้ - บางครั้งมันก็แค่เป็นเรื่องของการมองปัญหาจากมุมที่ต่างออกไป ฉันคิดว่า :) - person Vincent; 16.11.2018