得到"错误:`output.path`需要是一个绝对路径或`/`"

raj*_*iav 27 webpack webpack-dev-server

我是JS开发的新手,尝试使用webpack-dev-server热插拔更改我保持异常.确切的堆栈是:

Error: `output.path` needs to be an absolute path or `/`.
at Object.Shared.share.setFs (/Users/mybox/work/day1/ex6/node_modules/webpack-dev-middleware/lib/Shared.js:88:11)
at Shared (/Users/mybox/work/day1/ex6/node_modules/webpack-dev-middleware/lib/Shared.js:214:8)
at module.exports (/Users/mybox/work/day1/ex6/node_modules/webpack-dev-middleware/middleware.js:22:15)
at new Server (/Users/mybox/work/day1/ex6/node_modules/webpack-dev-server/lib/Server.js:56:20)

at startDevServer (/Users/mybox/work/day1/ex6/node_modules/webpack-dev-server/bin/webpack-dev-server.js:379:12)
at processOptions (/Users/mybox/work/day1/ex6/node_modules/webpack-dev-server/bin/webpack-dev-server.js:317:3)
at Object.<anonymous> (/Users/mybox/work/day1/ex6/node_modules/webpack-dev-server/bin/webpack-dev-server.js:441:1)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
Run Code Online (Sandbox Code Playgroud)

这是我已经尝试过的webpack配置文件:

module.exports = {
    entry: "./client/app.jsx",
    output: {
        path: "dist/js",
        filename: "bundle.js",
        publicPath: "http://127.0.0.1:2992/js"
    },
    module: {
        loaders: [
            {
                test: /.jsx?$/,
                loader: "babel-loader",
                include: /client/
            }
        ]
    }
};
Run Code Online (Sandbox Code Playgroud)

和:

module.exports = {
    entry: "./client/app.jsx",
    output: {
        path: "/Users/mybox/work/day1/ex6/dist/js",
        filename: "bundle.js",
        publicPath: "http://127.0.0.1:2992/js"
    },
    module: {
        loaders: [
            {
                test: /.jsx?$/,
                loader: "babel-loader",
                include: /client/,
                query: {
                    presets:['react']
                }
            }
        ]
    }
};
Run Code Online (Sandbox Code Playgroud)

下面是我的package.json文件

{
 "name": "ex6",
 "version": "1.0.0",
 "main": "index.js",
 "scripts": {
   "server": "node index.js",
   "hot": "webpack-dev-server --inline --hot --port 2992 --progress --colors",
   "dev": "webpack-dev-server --inline --dev --port 2992 --progress --colors"
 },
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
  "babel-preset-es2015": "^6.22.0",
  "hapi": "^16.1.0",
  "inert": "^4.1.0"
},
"devDependencies": {
"babel": "^6.5.2",
"babel-cli": "^6.22.2",
"babel-core": "^6.22.1",
"babel-loader": "^6.2.10",
"babel-preset-react": "^6.22.0",
"builder": "^3.2.1",
"webpack": "^2.2.1",
"webpack-dev-server": "^2.3.0"
},
"description": ""
}
Run Code Online (Sandbox Code Playgroud)

Har*_*dha 71

正如错误消息所示,您需要使用绝对路径.

要获取当前目录的绝对路径,可以使用__dirname获取当前目录,然后追加dist/js.所以它会是这样的,

output: {
    path: __dirname + "/dist/js", // or path: path.join(__dirname, "dist/js"),
    filename: "bundle.js"
}
Run Code Online (Sandbox Code Playgroud)

两者都可以正常工作.您可以在此处阅读有关webpack配置的信息

编辑:要使用,path: path.join(__dirname, "dist/js")您需要要求节点的内置path模块.

引用文档:

路径模块:它提供了处理文件和目录路径的实用程序.将它与前缀__dirname全局一起使用将防止操作系统之间的文件路径问题,并允许相对路径按预期工作.

您可以在webpack.config.jsas 的顶部要求它

var path = require('path');
.....
....
..
output: {
    path: path.join(__dirname, "dist/js"),
    filename: "bundle.js"
}
// rest of the configuration
Run Code Online (Sandbox Code Playgroud)

除了以上两种方法,您还可以使用此处path.resolve提到的方法.

path: path.resolve(__dirname, "dist/js")
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)

  • @hungryWolf 我不知道为什么做出这个设计决定,但对于“webpack”用户来说这是一个限制和一致性问题。我们很快就可以使用“output.path”的相对路径值。您可以访问此 PR 了解详细信息:https://github.com/webpack/webpack/pull/6214 (2认同)