reactjs - 缩小 React 代码时如何保留注释?

标签 reactjs webpack

我在 React 应用程序中有以下 JSX:

render() {
  return (
    <div>
      {/* A JSX comment */}
    </div>
  )
}

我正在使用 webpack 来编译和缩小代码。

在我的 webpack 插件中,我使用 UglifyJsPlugin 来尝试保留评论:

new webpack.optimize.UglifyJsPlugin( {
    compress: {
        warnings: false,
        // Disabled because of an issue with Uglify breaking seemingly valid code:
        // https://github.com/facebookincubator/create-react-app/issues/2376
        // Pending further investigation:
        // https://github.com/mishoo/UglifyJS2/issues/2011
        comparisons: false,
    },
    mangle: {
        safari10: true,
        except: ['__', '_n', '_x', '_nx' ],
    },
    output: {
        comments: true,
        // Turned on because emoji and regex is not minified properly using default
        // https://github.com/facebookincubator/create-react-app/issues/2488
        ascii_only: true,
    },
    extractComments: false,
    sourceMap: shouldUseSourceMap,
} ),

comments:true 保留了 React 中的一些注释,但我来自 JSX /* A JSX comment */ 的注释已从缩小的代码中删除。如何防止该注释从缩小/生产代码中删除?

我的 Babel 模块规则也打开了注释:

{
    test: /\.(js|jsx|mjs)$/,
    exclude: /(node_modules|bower_components)/,
    use: {
        loader: 'babel-loader',
        options: {
            // @remove-on-eject-begin
            babelrc: false,
            presets: [ require.resolve( 'babel-preset-cgb' ) ],
            // @remove-on-eject-end
            // This is a feature of `babel-loader` for webpack (not Babel itself).
            // It enables caching results in ./node_modules/.cache/babel-loader/
            // directory for faster rebuilds.
            cacheDirectory: false,
            comments: true,
        },
    },
},

最佳答案

我深入研究了 Babel 的存储库并发现了一个报告的错误

如何在babel转换后保留jsx注释#7153

它已于去年修复,修复进入 7.0.0-beta.37 。因此,如果该功能对您来说真的很重要,您就必须升级 Babel 的版本。

[UPD]我相信这只是上述错误的一个边缘情况。

正如我们在 online sandbox 中看到的那样您的代码被转换为

render() {
  return React.createElement("div", null);
}

但是一旦我至少放置了明确的null:

render() {
  return (
    <div>
      {null/* A JSX comment */}
    </div>
  )
}

它不会删除评论:

render() {
  return React.createElement("div", null, null
  /* A JSX comment */
  );
}

因此,仅当同一 block 中没有其他 token 时,注释才会被删除。

由于旧的错误已永远关闭,我已经添加了新的错误 #10118,因此无论谁发现此主题并寻找解决方案,最好检查此票证是否有更新

关于reactjs - 缩小 React 代码时如何保留注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56666638/

相关文章:

reactjs - 在 React.js 上测试自动化

javascript - 在带有 typescript 的 create-react-app 中使用 mozilla pdf.js

node.js - 从 Axios/React 将 json POST 到 Node/Express 服务器时出现问题

javascript - 为什么webpack找不到loader

reactjs - 什么是扁平 bundle ?为什么 Rollup 在这方面比 Webpack 更好?

webpack - 选择打开哪个Webpack浏览器?

reactjs - React Router v4 支持 React 16 (Fiber) 吗?

javascript - 尝试使用 onclick 函数时,this.state.push 在 ReactJS 上未定义

javascript - 在 webpack 中通过 jQuery 触发事件并在页面上处理

webpack - [Vue 警告] : Failed to mount component: template or render function not defined in Webpack 4