不是来自 webpack 的内容由 /foo 提供
Content not from webpack is served from /foo
我无法启动此服务器,我阅读了 webpack-dev-server docs。
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
package.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
第一个问题是您正在提供来自 assets/
的内容,但您没有那个目录,您有 public/assets/
而这甚至不是您想要的,因为您的 index.html
在 public/
中。所以你真正想要的是将 contentBase
设置为 public/
:
devServer: {
contentBase: __dirname + "/public/",
inline: true,
host: '0.0.0.0',
port: 8080,
},
现在您仍然会遇到 webpack-dev-server
未提供正确捆绑包的问题。它可能有效,但那是因为您在实际文件系统上有捆绑包,它将被使用而不是 webpack-dev-server
从内存中提供的捆绑包。原因是 webpack-dev-server
仅在命中正确路径时才从内存中提供服务。假设您在 index.html
中包含 assets/bundle.js
,这将匹配路径,但您设置的是 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 的加载程序。
这可能是 'react-scripts' 的问题,对我来说,它不适用于 3.4.1 版本,我将版本升级到 3.4.0,现在可以使用了。
打开 package.json 文件,然后更改 "react-scripts": "3.4.0",如果是其他的,或者您可以根据您的要求尝试不同的版本。但是这个问题似乎与 "react-scripts" 版本有关,因此您需要检查一下。
我遇到了同样的问题,将 react-scripts 版本 3.4.1 更改为 3.4.0 后解决了。不知道为什么!
如果你使用的是 webpack dev server ^v4.0.0
(在这个 post 时仍然是 RC),contentBase
属性 更改为 static
.
devServer: {
// ...
static: __dirname + "/public/",
// ...
},
变更日志:https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md#static
我无法启动此服务器,我阅读了 webpack-dev-server docs。
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
package.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
第一个问题是您正在提供来自 assets/
的内容,但您没有那个目录,您有 public/assets/
而这甚至不是您想要的,因为您的 index.html
在 public/
中。所以你真正想要的是将 contentBase
设置为 public/
:
devServer: {
contentBase: __dirname + "/public/",
inline: true,
host: '0.0.0.0',
port: 8080,
},
现在您仍然会遇到 webpack-dev-server
未提供正确捆绑包的问题。它可能有效,但那是因为您在实际文件系统上有捆绑包,它将被使用而不是 webpack-dev-server
从内存中提供的捆绑包。原因是 webpack-dev-server
仅在命中正确路径时才从内存中提供服务。假设您在 index.html
中包含 assets/bundle.js
,这将匹配路径,但您设置的是 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 的加载程序。
这可能是 'react-scripts' 的问题,对我来说,它不适用于 3.4.1 版本,我将版本升级到 3.4.0,现在可以使用了。 打开 package.json 文件,然后更改 "react-scripts": "3.4.0",如果是其他的,或者您可以根据您的要求尝试不同的版本。但是这个问题似乎与 "react-scripts" 版本有关,因此您需要检查一下。
我遇到了同样的问题,将 react-scripts 版本 3.4.1 更改为 3.4.0 后解决了。不知道为什么!
如果你使用的是 webpack dev server ^v4.0.0
(在这个 post 时仍然是 RC),contentBase
属性 更改为 static
.
devServer: {
// ...
static: __dirname + "/public/",
// ...
},
变更日志:https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md#static