Webpack编译成功但http://localhost:8080返回404错误求助
解决webpack-dev-server访问404问题
问题场景
已安装webpack、webpack-cli、css-loader、node-sass、sass、sass-loader、style-loader、mini-css-extract-plugin依赖,执行npm start启动webpack-dev-server后,访问http://localhost:8080出现Cannot GET /的404错误。直接打开本地index.html文件可正常显示样式,但无法通过本地服务访问。
问题原因
- webpack-dev-server默认将打包资源存放在内存中,不会写入
dist目录,当前配置未指定服务器的静态文件目录,导致服务器根目录找不到可访问的入口文件。 - index.html中引用的资源路径是基于本地文件系统的相对路径,在服务器环境下路径无效。
- 开发环境使用
MiniCssExtractPlugin生成独立CSS文件,但该插件在dev-server模式下不会将文件输出到磁盘,导致页面无法加载到样式。
解决方案
1. 调整webpack.config.js配置
添加devServer配置,指定静态文件目录,并优化开发环境的样式处理方式:
const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = { mode: "development", entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'js/main.js', publicPath: '/' // 确保资源路径基于服务器根目录 }, module: { rules: [ { test: /\.s[ac]ss$/i, use: [ // 开发环境用style-loader,直接将样式注入页面,支持热更新 'style-loader', "css-loader", "sass-loader", ], }, ], }, plugins: [ // 开发环境注释掉MiniCssExtractPlugin,生产环境再启用 // new MiniCssExtractPlugin({ // filename: 'css/main.css', // }) ], watch: true, devServer: { static: { directory: path.join(__dirname, './'), // 指定静态文件目录为项目根目录 }, compress: true, port: 8080, open: true, // 启动后自动打开浏览器 historyApiFallback: true // 确保根路径返回index.html } };
2. 修改index.html资源引用路径
调整为服务器环境下的有效路径,同时移除对未生成的dist目录CSS文件的引用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Dellmayer</title> <!-- 开发环境无需手动引入CSS,style-loader已自动注入 --> </head> <body class="page__body"> <header class="header"> <nav class="menu"> <ul class="menu__list"> <li class="menu__item">HOME</li> <li class="menu__item">HISTORY</li> <li class="menu__item">PRODUCT</li> <li class="menu__item">SPECIFICATION</li> <li class="menu__item">IN THE BOX</li> <li class="menu__item">CONTACT</li> </ul> </nav> </header> <!-- 引用内存中的打包JS文件 --> <script type="text/javascript" src="/js/main.js"></script> </body> </html>
3. 优化package.json启动命令(可选)
webpack 5推荐使用webpack serve替代webpack-dev-server,更新scripts:
{ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "webpack serve" } }
验证
执行npm start启动服务,浏览器会自动打开http://localhost:8080,此时页面应正常加载,样式也能正确显示。
内容的提问来源于stack exchange,提问作者Serhii Yunnikov
相关产品推荐
相关产品推荐

