【问题标题】:Getting "Error: `output.path` needs to be an absolute path or `/`"得到“错误:`output.path`需要是绝对路径或`/`”
【发布时间】:2017-06-29 05:18:37
【问题描述】:

我是 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)

这是我已经尝试过的 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/
            }
        ]
    }
};

还有:

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']
                }
            }
        ]
    }
};

下面是我的 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": ""
}

【问题讨论】:

    标签: webpack webpack-dev-server


    【解决方案1】:

    您可以使用__dirname 获取当前执行文件的路径。

    const webpack = require('webpack')
    
    module.exports = {
        mode: 'development',
        entry: __dirname + "/src/index.js",
        output: {
            path: __dirname + "/dist",
            filename: 'main.js'
        }
    }
    

    你也可以导入内置的path API & 使用 resolve 方法,我认为这个是 webpack 更喜欢的

    const webpack = require('webpack')
    const path = require('path')
    
    module.exports = {
        mode: 'development',
        entry:  path.resolve("./src/index.js"),
        output: {
            path: path.resolve("./dist"),
            filename: 'main.js'
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      output: {
          path: __dirname + "/dist/js", // or path: path.join(__dirname, "dist/js"),
          filename: "bundle.js"
      }
      

      两者都可以正常工作。您可以阅读有关 webpack 配置的信息here

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

      引用自文档:

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

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

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

      除了以上两种方法外,还可以使用path.resolve,如here所述。

      path: path.resolve(__dirname, "dist/js")
      

      希望对你有帮助:)

      【讨论】:

      • 由于某种原因,我仍然遇到路径相同的异常:“./dist/js”,而 __dirname +“dist/js” 工作正常。
      • ./dist/js 是相对路径。可能这就是您收到错误的原因。但在我的项目中,它运行良好。你使用的是哪个版本的 webpack?
      • webpack": "^2.2.1", "webpack-dev-server": "^2.3.0"
      • 你能说得更具体些吗?你得到什么错误?如果您的路径未定义,您是否需要 var path = require('path'); 的路径?
      • @hungryWolf 我不知道为什么会做出这个设计决定,但对于webpack 用户来说,这是一个限制和一致性问题。我们很快就能使用output.path 的相对路径值。您可以访问此 PR 了解详情:github.com/webpack/webpack/pull/6214
      【解决方案3】:

      您需要将其包含在 webpack.config.js 文件 var path = require('path') 的顶部 然后在您的路径中执行以下操作:path: path.join(__dirname, "dist/js")

      【讨论】:

        【解决方案4】:

        您可以像下面的代码一样使用它来获取绝对路径。

        output: {
          path: require('path').resolve("./dist/js"),
          filename: 'bundle.js',
          publicPath: 'http://127.0.0.1:2992/js'
        }
        

        【讨论】:

        • 路径中不需要。这应该在文件顶部定义,以便其他路径可以引用它。这是不好的做法。
        猜你喜欢
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 2017-08-19
        • 2018-03-26
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 1970-01-01
        相关资源
        最近更新 更多