删除生产分发文件中的一些代码行?

s1n*_*7ax 9 javascript babel webpack

我正在使用BabelWebpack从中生成ES5代码ES6.有一些验证用于减少我在编码时所犯的错误.

class Logger {
    /**
     * @param {LogModel} info
     *  {LogTypes} type
     *  {String} message
     *  {Date} date
     */
    static log(info) {
        if(info instanceof LogModel)
            throw new Error("not a instance of LogModel");

        notify(info);
    }
}
Run Code Online (Sandbox Code Playgroud)

log函数中,我验证参数是否是LogModel类的实例.这只是为了防止错误.我不希望如果条件在生产中,因为太多,如果条件会减慢应用程序.是否可以使用验证和生产版本生成开发版本,而无需使用BabelWebpack

Pat*_*und 13

看来其他答案已经过时了.使用webpack 4,您可以mode: 'production'在webpack配置中进行设置.

在您的代码中,检查这样的开发模式:

if (process.env.NODE_ENV === 'development') {
    if(info instanceof LogModel)
        throw new Error("not a instance of LogModel");
}
Run Code Online (Sandbox Code Playgroud)

当webpack创建一个包时mode: 'production',这些if子句中的所有代码以及if子句本身将自动从包中删除.

没有必要明确使用define插件(它由webpack"引擎盖下"使用),并且没有必要使用类似webpack-unassert-loaderwebpack-strip-block在其他答案中提到的内容.

看看这个我试过的小演示回复:https://github.com/pahund/webpack-devprod-experiment

  • webpack 不会从编译后的代码中删除 if 块 (3认同)
  • 如果您不想删除该块中的所有代码怎么办?“webpack-strip-block”似乎给了你更多的控制权。 (2认同)

rgt*_*ree 6

您可以使用assert包来强制执行您的代码,然后使用webpack-unassert-loaderwebpack-strip-assert去除生产代码的断言。

var assert = require('assert').ok;

class Logger {
    /**
     * @param {LogModel} info
     *  {LogTypes} type
     *  {String} message
     *  {Date} date
     */
    static log(info) {
        assert(info instanceof LogModel, "Param must be an instance of LogModel");
        notify(info);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

更清洁的选项将使用webpack中的define-plugin.

在配置文件中:

new webpack.DefinePlugin({ __DEV: JSON.stringify(true) })

app.js:

if(__DEV){ console.log("logged only in dev env") }

__DEV将由webpack在编译时提供.


s1n*_*7ax 5

webpack-strip-block是一个很好的解决方案。编译时,它将删除生产代码中的代码块。

/* develblock:start */
/* develblock:end */
Run Code Online (Sandbox Code Playgroud)

不限于asserts,并且prod中没有冗余代码。

  • 即使使用“ mode = production”,webpack也不会删除开发人员代码 (3认同)