【问题标题】:Webpack 4 devtool option does not work with webpack-dev-serverWebpack 4 devtool 选项不适用于 webpack-dev-server
【发布时间】:2018-04-30 17:52:28
【问题描述】:

在我决定发布这个问题之前,我做了很多事情作为背景调查。 所以,我的问题是:

- 我使用 webpack v4.6.0 和 webpack-dev-server v3.1.3 - 它们一起工作得很好,但现在我正在尝试为我的应用程序设置源映射,devtool option 似乎不起作用。

至少对我来说,我已经尝试并测试了列表中的每个选项:

  • Webpack 4 - Sourcemaps: 这个问题表明devtool: 'source-map' 应该开箱即用,但对我来说不是这样
  • how to make webpack sourcemap to original files :将devtoolModuleFilenameTemplate: info =>'file://' + path.resolve(info.absoluteResourcePath).replace(/\\/g, '/') 添加到我的输出配置并没有太大帮助,而不是client.js 它为我显示index.js 虽然
  • https://github.com/webpack/webpack/issues/6400:这不是对我的问题的准确描述,通过尝试这里的方法似乎也对我没有帮助
  • 我尝试使用 webpack.SourceMapDevToolPlugin,但它也不适用于我的设置,即使我删除了 devtools 或将它们设置为 false
  • 我这里没有使用 UglifyJS 插件
  • 我知道 webpack-dev-server 现在正在维护中,所以我尝试了 webpack-serve,但似乎 source maps 也无法使用它
  • 我也尝试过source-map-support包,但也没有运气,和here有类似的情况:

您是否知道该问题是否会由一些 PR 解决,或者您是否尝试过自己解决?任何提示或帮助表示赞赏!

我希望得到此处所述的输出,in blogpost,其中包含指向我的文件和原始文件代码的直接链接。

我的 webpack.js

// webpack v4.6.0
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const WebpackMd5Hash = require('webpack-md5-hash');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const stylish = require('eslint/lib/formatters/stylish');
const webpack = require('webpack');

module.exports = {
  entry: { main: './src/index.js' },
  output: {
    devtoolModuleFilenameTemplate: info =>
      'file://' + path.resolve(info.absoluteResourcePath).replace(/\\/g, '/'),
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[hash].js'
  },
  devtool: 'source-map',
  devServer: {
    contentBase: './dist',
    hot: true
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
        options: {
          formatter: stylish
        }
      }
    ]
  },
  plugins: [
    // new webpack.SourceMapDevToolPlugin({
    //   filename: '[file].map',
    //   moduleFilenameTemplate: undefined,
    //   fallbackModuleFilenameTemplate: undefined,
    //   append: null,
    //   module: true,
    //   columns: true,
    //   lineToLine: false,
    //   noSources: false,
    //   namespace: ''
    // }),
    new CleanWebpackPlugin('dist', {}),
    new HtmlWebpackPlugin({
      inject: false,
      hash: true,
      template: './src/index.html',
      filename: 'index.html'
    }),
    new WebpackMd5Hash(),
    new webpack.NamedModulesPlugin(),
    new webpack.HotModuleReplacementPlugin()
  ]
};

我的 package.json

{
  "name": "post",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "storybook": "start-storybook -p 9001 -c .storybook",
    "dev": "webpack-dev-server --mode development --open",
    "build": "webpack --mode production"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@storybook/addon-actions": "^3.4.3",
    "@storybook/react": "v4.0.0-alpha.4",
    "babel-cli": "^6.26.0",
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.4",
    "babel-preset-env": "^1.6.1",
    "babel-preset-react": "^6.24.1",
    "babel-runtime": "^6.26.0",
    "clean-webpack-plugin": "^0.1.19",
    "eslint": "^4.19.1",
    "eslint-config-prettier": "^2.9.0",
    "eslint-loader": "^2.0.0",
    "eslint-plugin-prettier": "^2.6.0",
    "eslint-plugin-react": "^7.7.0",
    "html-webpack-plugin": "^3.2.0",
    "prettier": "^1.12.1",
    "react": "^16.3.2",
    "react-dom": "^16.3.2",
    "webpack": "v4.6.0",
    "webpack-cli": "^2.0.13",
    "webpack-dev-server": "v3.1.3",
    "webpack-md5-hash": "0.0.6",
    "webpack-serve": "^0.3.1"
  },
  "dependencies": {
    "source-map-support": "^0.5.5"
  }
}

我在控制台的输出是:

编辑:

我看到了一个类似的问题here,但似乎没有人回答。 错误是故意犯的! 这不仅适用于 linting 错误,还适用于我的应用程序的每个错误。 Here is a link to my GITHUB repo: https://github.com/marharyta/webpack-fast-development

更新 01.05.2018

我创建了另一个具有更清洁设置的存储库:https://github.com/marharyta/webpack-4.6.0-test 并详细说明我是如何到达这里的:https://medium.com/p/79fb676417f4/edit webpack 贡献者给出了一些建议,但对我仍然不起作用:https://github.com/marharyta/webpack-4.6.0-test/issues/1

更新 02.05.2018

经过长时间的调查,我在下面发布了我的答案。问题是 ESLint 可能还有一些模式标记,因为我必须使用 CLI 方式进行操作。 我在 ESLint 加载器中也存在问题:https://github.com/webpack-contrib/eslint-loader/issues/227 我还在这里创建了一个带有更详细描述的帖子:https://medium.com/@riittagirl/how-to-solve-webpack-problems-the-practical-case-79fb676417f4

【问题讨论】:

    标签: reactjs npm webpack webpack-dev-server source-maps


    【解决方案1】:

    所以,经过长时间的尝试和错误,我终于得到了一位 webpack 维护者的帮助。 主要问题是 eslint。如果将其作为加载程序加载,则会产生意外行为。 通过从 js 的 webpack 加载器中删除 eslint,您可以解决这个问题。

    之前的webpack设置:

    // webpack v4
    const path = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const WebpackMd5Hash = require('webpack-md5-hash');
    const CleanWebpackPlugin = require('clean-webpack-plugin');
    
    const baseConfig = {
      entry: { main: './src/index.js' },
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name].[hash].js'
      },
      devServer: {
        contentBase: './dist',
        hot: true,
        open: true
      },
      module: {
        rules: [
          {
            test: /\.js$/,
            exclude: /node_modules/,
            **use: [
              { loader: 'babel-loader' },
              {
                loader: 'eslint-loader',
                options: { formatter: require('eslint/lib/formatters/stylish') }
              }**
            ]
          }
        ]
      },
      plugins: [
        new CleanWebpackPlugin('dist'),
        new HtmlWebpackPlugin({
          inject: false,
          hash: true,
          template: './src/index.html',
          filename: 'index.html'
        }),
        new WebpackMd5Hash()
      ]
    };
    
    if (process.env.NODE_ENV === 'development') {
      baseConfig.devtool = 'inline-source-map';
    }
    
    module.exports = baseConfig

    之后工作的 webpack:

    // webpack v4
    const path = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const WebpackMd5Hash = require('webpack-md5-hash');
    const CleanWebpackPlugin = require('clean-webpack-plugin');
    module.exports = {
      entry: { main: './src/index.js' },
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name].[hash].js'
      },
      devtool: 'cheap-module-source-map',
      devServer: {
        contentBase: './dist',
        hot: true,
        open: true
      },
      module: {
        rules: [
          {
            test: /\.js$/,
            exclude: /node_modules/,
            **use: [{ loader: 'babel-loader' }]**
          }
        ]
      },
      plugins: [
        new CleanWebpackPlugin('dist'),
        new HtmlWebpackPlugin({
          inject: false,
          hash: true,
          template: './src/index.html',
          filename: 'index.html'
        }),
        new WebpackMd5Hash()
      ]
    };

    我的 packeje.json 看起来像:

    {
      "name": "post",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "build": "webpack --mode=production",
        "start": "NODE_ENV=development webpack-dev-server --mode=development --hot"
      },
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "babel-cli": "^6.26.0",
        "babel-core": "^6.26.0",
        "babel-loader": "^7.1.4",
        "babel-preset-env": "^1.6.1",
        "babel-preset-react": "^6.24.1",
        "babel-runtime": "^6.26.0",
        "clean-webpack-plugin": "^0.1.19",
        "eslint": "^4.19.1",
        "eslint-config-prettier": "^2.9.0",
        "eslint-loader": "^2.0.0",
        "eslint-plugin-prettier": "^2.6.0",
        "eslint-plugin-react": "^7.7.0",
        "html-webpack-plugin": "^3.2.0",
        "prettier": "^1.12.1",
        "react": "^16.3.2",
        "react-dom": "^16.3.2",
        "webpack": "^4.6.0",
        "webpack-cli": "^2.0.13",
        "webpack-md5-hash": "0.0.6"
      },
      "dependencies": {
        "webpack-dev-server": "^3.1.3"
      }
    }

    另请参阅在我的分支上创建的问题的建议: https://github.com/marharyta/webpack-4.6.0-test

    【讨论】:

    • 非常感谢!在删除 ESlint 并设置 devtool: null 后,我的包大小从解析的 8 mb 变为解析的 1.6 mb。在此设置之前 devtool: null 会产生一个较小的生产包,但一个不起作用:)。删除 eslint 是缺少的步骤。如果没有你的回答,我永远不会明白这一点。
    【解决方案2】:

    在 webpack4 中,您需要在 webpack 配置中设置模式。请添加

    mode: "development"
    

    到你的 webpack 配置。

    您可以删除 NamedModulesPlugin,因为它已在开发模式下使用。

    选项source-map 用于生产构建。 对于您的开发版本,我会删除 devtool 道具,因为那时 webpack 使用 eval 作为默认值。 如果它不应该工作,然后尝试:

    devtool: 'cheap-module-eval-source-map'
    

    这就是我使用的。最小配置。

    const path = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const CleanWebpackPlugin = require('clean-webpack-plugin');
    const stylish = require('eslint/lib/formatters/stylish');
    const webpack = require('webpack');
    
    module.exports = {
      mode: 'development',
      entry: { main: './src/index.js' },
      output: {
        filename: '[name].[hash].js'
      },
      resolve: {
        extensions: ['.js', '.jsx']
      },
      devtool: 'cheap-module-eval-source-map',
      devServer: {
        hot: true,
        open: true
      },
      module: {
        rules: [
          {
            test: /\.jsx?$/,
            exclude: /node_modules/,
            use: [
              { loader: 'babel-loader' },
              { loader: 'eslint-loader', options: { formatter: stylish } }
            ]
          }
        ]
      },
      plugins: [
        new CleanWebpackPlugin('dist'),
        new HtmlWebpackPlugin({
          template: './src/index.html'
        }),
        new webpack.HotModuleReplacementPlugin()
      ]
    };
    

    【讨论】:

    • 设置模式没有帮助
    • 你是否也删除了这个 devtoolModuleFilenameTemplate?
    • 发布了我的最小配置。
    • 通过将您的建议粘贴到我的配置中,不幸的是它并没有得到修复,也许您可​​以给我更多信息,说明为什么使用 NamedModulesPlugin 可能会有问题?
    • No NamedModulesPlugin 不是问题。我只是想告诉你,它不再需要了。
    猜你喜欢
    • 1970-01-01
    • 2019-04-22
    • 2020-09-17
    • 2020-11-24
    • 2018-07-22
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多