javascript - 如何使 webpack 的 uglifyjs 插件不破坏 sass 的源映射?

标签 javascript webpack minify source-maps uglifyjs

设置如下:

package.json:

{
  "dependencies": {
    "css-loader": "^0.26.0",
    "extract-text-webpack-plugin": "^1.0.1",
    "html-webpack-plugin": "^2.24.1",
    "node-sass": "^3.13.0",
    "sass-loader": "^4.0.2",
    "style-loader": "^0.13.1",
    "webpack": "^1.13.3"
  }
}

webpack.config.js:

var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
    entry: './1.js',
    output: {
        path: 'dist',
        filename: 'bundle.js',
    },
    module: {
        loaders: [
            {test: /\.sass$/, loader: ExtractTextPlugin.extract('style', 'css?sourceMap!sass?sourceMap')},
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: 'template.ejs',
        }),
        new ExtractTextPlugin('[name].css'),
        new webpack.optimize.UglifyJsPlugin(),
    ],
    devtool: 'source-map',
};

template.ejs:

<!doctype html>
<html>
<body>

<div></div>

</body>
</html>

1.js:

require('./1.sass');

1.sass:

body
    background: #ddd
div
    width: 100px
    height: 100px
    margin: auto
    background: #333

然后

$ rm -rf dist/* && ./node_modules/.bin/webpack

并在 Chrome 中打开 http://example.com/dist。然后转到开发人员工具 > 元素选项卡。单击 div,然后单击 div { width: 100px; 的链接; ... } block 。您会发现自己位于第 2 行。但是,当您注释掉 new webpack.optimize.UglifyJsPlugin() 行时,您将位于第 3 行,正如预期的那样。我做错了什么?

最佳答案

首先要提到的是 UglifyJsPlugin switches所有加载程序进入最小化模式。来自 the docs :

Minimize all JavaScript output of chunks. Loaders are switched into minimizing mode.

但值得庆幸的是它在 coming 中进行了更改2.x version .

另一个问题是 libsass 生成 wrong source map ,当 outputStyle压缩时。当您不指定时 outputStyle 会被压缩 explicitly并且缩小已打开。

因此,目前的解决方法是指定除 compressed 之外的一些 outputStyle:

var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
    entry: './1.js',
    output: {
        path: 'dist',
        filename: 'bundle.js',
    },
    module: {
        loaders: [
            {test: /\.sass$/, loader: ExtractTextPlugin.extract('style', 'css?sourceMap!sass?sourceMap')},
        ]
    },
    sassLoader: {
        outputStyle: 'nested',
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: 'template.ejs',
        }),
        new ExtractTextPlugin('[name].css'),
        new webpack.optimize.UglifyJsPlugin(),
    ],
    devtool: 'source-map',
};

UPD 似乎最有可能的 source-map 也存在问题。包和css-loader包裹。因此,您可能会考虑禁用缩小,例如:css?sourceMap&-minimize

关于javascript - 如何使 webpack 的 uglifyjs 插件不破坏 sass 的源映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40724467/

相关文章:

javascript - 根据 Angular 2 中另一个组件中单击的内容更新一个组件中的数据

java - JSP 和外部 javascript 文件之间的交互

javascript - 在 ASP.NET MVC 中 bundle 时 CSS 没有被缩小

javascript - 是否可以使用 Amchart v4 在类别名称上显示工具提示?

javascript - webpack.js 中的 yargs.parse 错误

css - Webpack CSS 设置和最佳实践

javascript - 尽管将 webpack-dev-server 的 HistoryApiFallback 设置为 true,但我的 React 应用程序仍收到 404 错误

java - Android源代码如何缩小和混淆?

css - 如何使用 Gulp 从 SASS 文件生成缩小的 CSS

javascript - 通过 css 循环覆盖悬停元素