webpack react路由器问题找不到main.js

2j4z5cfb  于 2023-10-19  发布在  Webpack
关注(0)|答案(1)|浏览(216)

目前,我有一个react应用程序,加上typescript和react-router dom。
我设置了一个breadcrumbs.tsx文件,如下所示

  1. import { Link, useLocation } from 'react-router-dom';
  2. export default function Breadcrumbs() {
  3. const location = useLocation();
  4. let currentLink = '';
  5. return (
  6. <ul >
  7. {location.pathname !== "/" ? (<li>
  8. <Link to="/">Home</Link>
  9. </li>) : (
  10. <li>
  11. <span>Home</span>
  12. </li>)
  13. }
  14. {location.pathname
  15. .split('/')
  16. .filter(crumb => crumb !== "")
  17. .map(crumb => {
  18. currentLink += `/${crumb}`;
  19. return (
  20. <li key={currentLink} >
  21. {"\t>>\t"}
  22. {location.pathname !== currentLink ? (
  23. <Link to={currentLink}>{crumb}</Link>)
  24. : (
  25. <span >{crumb}</span>
  26. )
  27. }
  28. </li>
  29. );
  30. })
  31. }
  32. </ul>
  33. );
  34. }

我的App.tsx是这样的:

  1. import Home from './Home';
  2. import Test1 from './test1';
  3. import Test from './test';
  4. function App() {
  5. return (
  6. <Routes>
  7. <Route path="/" element={<Home />} />
  8. <Route path="/test" element={<Test />} />
  9. <Route path="/test/1" element={<Test1 />} />
  10. </Routes>
  11. );
  12. }

Home.tsx是:

  1. import { Link } from 'react-router-dom';
  2. export default function Home() {
  3. return (
  4. <div>
  5. <p>Home</p>
  6. <div><Link to="/test">test</Link></div>
  7. <div><Link to="/test/1">test 1</Link></div>
  8. </div>
  9. )
  10. }

Test.tsx是:

  1. import { Link } from "react-router-dom";
  2. import Breadcrumbs from "./breadcrumbs";
  3. export default function Test() {
  4. return (
  5. <div>
  6. Test
  7. <Breadcrumbs />
  8. <div><Link to="/">Home</Link></div>
  9. <div><Link to="/test/1">test 1</Link></div>
  10. </div>
  11. )
  12. }

Test1.tsx与上面相同,只是名称为Test 1,第二个链接指向/test页面。
我的webpack.common.js构建文件是(注意:使用scss、graphql的其他代码未示出):

  1. const path = require('path');
  2. const CopyWebpackPlugin = require('copy-webpack-plugin');
  3. const MiniCssExtractPlugin = require("mini-css-extract-plugin");
  4. const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
  5. module.exports = {
  6. entry: './src/index.tsx',
  7. output: {
  8. filename: 'main.js',
  9. path: path.resolve(__dirname, '../dist'),
  10. publicPath: '/', // change to CDN in webpack.prod.js,
  11. assetModuleFilename: 'assets/images/[hash][ext][query]'
  12. },
  13. target: 'web',
  14. optimization: { // only runs in production
  15. minimizer: [
  16. `...`, // terserplugin
  17. new CssMinimizerPlugin()
  18. ]
  19. },
  20. node: {
  21. __dirname: true
  22. },
  23. module: {
  24. rules: [
  25. {
  26. test: /\.(ts|js)x?$/,
  27. use: 'babel-loader',
  28. exclude: /node_modules/
  29. },
  30. // Component / Page CSS
  31. {
  32. test: /\.module.scss$/,
  33. exclude: /^(?!(.*)module.scss$).*\.scss$/,
  34. use: [
  35. MiniCssExtractPlugin.loader,
  36. {
  37. loader: "css-loader",
  38. options: {
  39. modules: {
  40. localIdentName: '[name]__[local]__[hash:base64:5]'
  41. },
  42. sourceMap: true
  43. }
  44. },
  45. "sass-loader"
  46. ]
  47. },
  48. {
  49. test: /\.s?css$/,
  50. exclude: /\.module.scss$/,
  51. use: [
  52. MiniCssExtractPlugin.loader,
  53. "css-loader",
  54. "sass-loader"
  55. ]
  56. },
  57. {
  58. test: /\.(jpe?g|png|gif|svg)$/i,
  59. type: 'asset/resource'
  60. }
  61. ]
  62. },
  63. resolve: {
  64. extensions: [
  65. ".js",
  66. ".jsx",
  67. ".tsx",
  68. ".ts",
  69. ".scss"
  70. ],
  71. mainFields: [
  72. 'browser',
  73. 'main',
  74. 'module'
  75. ]
  76. },
  77. plugins: [
  78. new CopyWebpackPlugin({
  79. patterns: [{ from: 'public/index.html', to: 'index.html' }]
  80. }),
  81. new MiniCssExtractPlugin()
  82. ]
  83. };

prod还具有mode: 'production', stats: "errors-only"
index.html文件是:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>App</title>
  6. <meta name="Author" content="author" />
  7. <meta name="Description" content="desc" />
  8. <meta name="Keywords" content="keyword" />
  9. <link rel="icon" href="/favicon.ico" />
  10. <meta name="viewport" content="width=device-width, initial-scale=1" />
  11. <meta name="theme-color" content="#000000" />
  12. <link rel="apple-touch-icon" href="/logo192.png" />
  13. <script defer="defer" src="main.js"></script>
  14. <link rel="stylesheet" href="main.css">
  15. </head>
  16. <body>
  17. <div id="root"></div>
  18. </body>
  19. </html>

当我运行上面显示的webpack文件构建的应用程序时,我试图直接路由到localhost:8080/test/1(不使用按钮),它会抛出这个错误:

红线上写着:

我理解这个问题是因为main.jsmain.css文件正在dist文件夹中构建,但html文件正在根目录的/test/文件夹中查找它们。
我该如何解决此问题?
注意:使用create-react-app my-app --template typescript沿着与react-router-dom具有相同的设置,构建它,并使用serve -s build,在路由/test/1中的html文件仍然有jscss文件在/static/文件夹中,无论你在什么路由。我该怎么做?
任何帮助都是感激不尽的。

gwo2fgha

gwo2fgha1#

修复了这个问题,我只需要像这样修改两行(注意添加的/):

  1. <script defer="defer" src="main.js"></script>
  2. <link rel="stylesheet" href="main.css">
  1. <script defer="defer" src="/main.js"></script>
  2. <link rel="stylesheet" href="/main.css">

index.html

相关问题