不是来自 webpack 的内容由 /foo 提供

新手上路,请多包涵

我只是无法启动此服务器,我阅读了 webpack-dev-server 文档

 devServer: {
  contentBase: path.join(__dirname, "dist"),
  compress: true,
  port: 9000
}

示例代码看起来很简单,但我无法成功启动此服务器,无论我尝试什么,不同的文件夹,它都无法获取 内容!我错过了什么吗?

任何帮助将不胜感激。

输出:

 Project is running at http://0.0.0.0:8080/
webpack output is served from /assets/
Content not from webpack is served from ~/WebstormProjects/react_back/assets/

我的项目结构:

 ├── [drwxr-xr-x ]  src
│   └── [-rw-r--r-- ]  index.js
├── [drwxr-xr-x ]  public
│   ├── [-rw-r--r-- ]  index.html
│   ├── [drwxr-xr-x ]  assets
│   │   └── [-rw-r--r-- ]  bundle.js
│   └── [-rw-r--r-- ]  favicon.ico
├── [-rw-r--r-- ]  package.json
├── [-rw-r--r-- ]  npm-debug.log
├── [-rw-r--r-- ]  webpack.config.js

包.json

   "scripts": {
    "build": "webpack",
    "dev": "webpack-dev-server --devtool eval"
  },

webpack.config.js

 module.exports = {
    entry: __dirname + "/src/index.js",
    output: {
        path: __dirname + "/public",
        publicPath: "/assets/",
        filename: "assets/bundle.js",
        chunkFilename: '[name].js'
    },
    devServer: {
        contentBase: __dirname + "/assets/",
        inline: true,
        host: '0.0.0.0',
        port: 8080,
    },
    module: {
        loaders: [
            {
                test: /\.(jpg|jpeg|gif|png|ico)$/,
                exclude: /node_modules/,
                loader: 'file-loader?name=[name].[ext]'
            },
            {
                test: /\.js$/,
                exclude: /node_modules/,
                loader: 'babel-loader',
                query: {
                    presets: ["es2016", "react", "env", "stage-2"]
                }
            }
        ]
    }
};

版本:

 ➜  node -v
v7.6.0
➜  webpack-dev-server -v
webpack-dev-server 2.4.1
webpack 2.2.1

原文由 McGrady 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

第一个问题是您从 assets/ 提供内容,但您没有该目录,您有 public/assets/ 这甚至不是您想要的,因为您的 index.htmlpublic/ 中。所以你真正想要的是将 contentBase 设置为 public/

 devServer: {
    contentBase: __dirname + "/public/",
    inline: true,
    host: '0.0.0.0',
    port: 8080,
},

现在您仍然会 webpack-dev-server 没有提供正确的捆绑包的问题。它可能会起作用,但那是因为您的实际文件系统上有捆绑包,它将被用来代替 webpack-dev-server 将从内存中提供的捆绑包。原因是 webpack-dev-server 仅在命中正确路径时才从内存中提供服务。假设您在 assets/bundle.js index.html ,这将与路径匹配,但您正在设置 publicPath: "/assets/" ,所以它将寻找 /assets/ 并为其添加文件名(即 assets/bundle.js ,实际上该捆绑包是从 /assets/assets/bundle.js 提供的。

要解决此问题,您可以删除 publicPath 选项(设置 publicPath: "/" 具有相同的效果)。

 output: {
    path: __dirname + "/public",
    filename: "assets/bundle.js",
    chunkFilename: '[name].js'
},

或者您可以将输出路径更改为 /public/assets/ 并将文件名更改为 bundle.js 。这也将使您的块进入资产目录,这可能是您想要的。

 output: {
    path: __dirname + "/public/assets/",
    publicPath: "/assets/",
    filename: "bundle.js",
    chunkFilename: '[name].js'
},

注意: publicPath 会影响一些改变资产 URL 的加载器。

原文由 Michael Jungo 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您使用的是 webpack 开发服务器 ^v4.0.0 (在这篇文章发布时仍然是 RC), contentBase 属性更改为 static

 devServer: {
   // ...
   static: __dirname + "/public/",
   // ...
},

变更日志: https ://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md#static

原文由 Kosta 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题