【问题标题】:Webpack: Cannot get index.html with express server middlewareWebpack:无法使用快速服务器中间件获取 index.html
【发布时间】:2021-10-21 18:11:52
【问题描述】:

我按照 webpack 的官方入门说明设置了一个小测试项目和配置文件。按照他们的建议,我使用带有 webpack 中间件的 express 服务器。

设置

server.js:

const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');

const app = express();
const config = require('./webpack.config.js');
const compiler = webpack(config);

// Tell express to use the webpack-dev-middleware and use the webpack.config.js
// configuration file as a base.
app.use(
    webpackDevMiddleware(compiler, {
        publicPath: config.output.publicPath,
    })
);

// Serve the files on port 3000.
app.listen(3000, function () {
    console.log('Example app listening on port 3000!\n');
});

我的目录文件夹如下所示:

- dist/
    - assets/
    - css/
    - bundle.index.html
    - bundle.about.html
    - index.html
    - about.html
- src/
    - fonts/
    - images/
    - sass/
    - templates/
        - about.html
        - index.html
    - ts/
        - abstracts/
        - utils/
        - pages/
            - about.ts
            - index.ts

这是我的webpack.config(为此删除了不必要的项目)。

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

module.exports = {
    mode: mode,
    entry: {
        index: './src/ts/pages/index.ts',
        about: './src/ts/pages/about.ts',
    },
    output: {
        filename: 'bundle.[name].js',
        path: path.resolve(__dirname, './dist'),
        clean: true,
        publicPath: '.',
        assetModuleFilename: 'assets/[name][ext][query]',
    },
    devServer: {
        port: 3000,
        sockPort: 3000,
        contentBase: path.resolve(__dirname, 'dist'),
    },
    plugins: [ 
        new HtmlWebpackPlugin({
            title: 'Index',
            filename: 'index.html',
            template: 'dist/index.html',
            chunks: ['index'],
        }),
        new HtmlWebpackPlugin({
            title: 'about',
            filename: 'about.html',
            template: 'dist/about.html',
            chunks: ['about'],
        }),
    ],
    module: {
        rules: [
            {
                test: /\.html$/i,
                loader: "html-loader",
            },
            // Support von versch. Grafiktypen
            {
                test: /\.(png|svg|jpg|jpeg|gif)$/i,
                type: 'asset/resource',
                generator: {
                    filename: './assets/images/[name][ext][query]'
                }
            },
            // Support von Fonts
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/i,
                type: 'asset/resource',
                generator: {
                    filename: './assets/fonts/[name][ext][query]'
                }
            },
        ],
    },
    resolve: {
        extensions: ['.ts'],
        alias: {
            Style: path.resolve(__dirname, './src/sass'),
            Fonts: path.resolve(__dirname, './src/fonts'),
            Images: path.resolve(__dirname, './src/images'),
        }
    }
};

问题

在我的浏览器中运行localhost:3000,快递返回Cannot get /

在我的浏览器中运行localhost:3000,快递返回Cannot get / index.html

在我的浏览器中运行localhost:3000/dist/index.html,快递返回Cannot get dist/index.html

简单地说,我不能访问任何东西。为什么?我的配置说 dist 目录应作为根目录。

  devServer: {
        port: 3000,
        sockPort: 3000,
        contentBase: path.resolve(__dirname, 'dist'),
    },

【问题讨论】:

    标签: node.js express webpack webpack-dev-server webpack-dev-middleware


    【解决方案1】:

    publicPath 选项的以下值应该可以工作:

    • publicPath: 'auto'
    • publicPath: '/'
    • publicPath: ''

    完整示例:

    webpack.config.js:

    const path = require("path");
    const HtmlWebpackPlugin = require("html-webpack-plugin");
    
    module.exports = {
      mode: "development",
      entry: {
        index: "./src/ts/pages/index.ts",
        about: "./src/ts/pages/about.ts",
      },
      output: {
        filename: "bundle.[name].js",
        path: path.resolve(__dirname, "./dist"),
        clean: true,
        publicPath: "",
      },
      plugins: [
        new HtmlWebpackPlugin({
          title: "Index",
          filename: "index.html",
          template: "src/templates/index.html",
          chunks: ["index"],
        }),
        new HtmlWebpackPlugin({
          title: "about",
          filename: "about.html",
          template: "src/templates/about.html",
          chunks: ["about"],
        }),
      ]
    };
    

    src/templates/index.html:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      index
    </body>
    
    </html>
    

    src/ts/pages/index.ts:

    console.log("index");
    

    server.js:

    const express = require("express");
    const webpack = require("webpack");
    const webpackDevMiddleware = require("webpack-dev-middleware");
    
    const app = express();
    const config = require("./webpack.config.js");
    const compiler = webpack(config);
    
    app.use(
      webpackDevMiddleware(compiler, {
        publicPath: config.output.publicPath,
      })
    );
    
    app.listen(3000, function () {
      console.log("Example app listening on port 3000!\n");
    });
    

    结果:

    软件包版本:

      "devDependencies": {
        "html-webpack-plugin": "^5.3.2",
        "webpack": "^5.51.1",
        "webpack-cli": "^4.8.0",
        "webpack-dev-server": "^4.0.0"
      },
      "dependencies": {
        "express": "^4.17.1",
        "webpack-dev-middleware": "^5.0.0"
      }
    

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2016-02-14
      • 1970-01-01
      • 2013-05-03
      • 2017-07-08
      相关资源
      最近更新 更多