我正在使用Babel
和Webpack
从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);
}
}
在log
函数中,我验证参数是否是LogModel
类的实例。这只是为了防止错误。我不希望如果条件在生产中,因为太多,如果条件会减慢应用程序。是否可以使用验证和生产版本生成开发版本,而不使用Babel
和Webpack
进行验证?
答案 0 :(得分:6)
其他答案似乎已过时。使用webpack 4,您可以在webpack配置中设置mode: 'production'
。
在您的代码中,检查像这样的开发模式:
if (process.env.NODE_ENV === 'development') {
if(info instanceof LogModel)
throw new Error("not a instance of LogModel");
}
当webpack使用mode: 'production'
创建一个包时,这些if子句中的所有代码以及if子句本身将自动从包中删除。
不需要显式使用define插件(Webpack在“幕后”使用),也不需要使用其他答案中提到的webpack-unassert-loader
或webpack-strip-block
之类的东西。
查看我制作的这个小样例回购尝试:https://github.com/pahund/webpack-devprod-experiment
答案 1 :(得分:5)
清洁选项将使用来自webpack的define-plugin。
在配置文件中:
new webpack.DefinePlugin({
__DEV: JSON.stringify(true)
})
app.js:
if(__DEV){
console.log("logged only in dev env")
}
值__DEV
将由webpack在编译时提供。
答案 2 :(得分:4)
您可以使用assert包来强制执行代码,然后使用webpack-unassert-loader或webpack-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);
}
}
答案 3 :(得分:3)
webpack-strip-block是一个很好的解决方案。编译时会删除生产代码中的代码块。
const xMap = MapFactory({
mySize: function() {return `Hi. My size is currently ${this.size}`}
});
const myMap = xMap.Create();
console.log(myMap.mySize());
console.log("setting [5, \"five\"]")
myMap.set(5, "five");
console.log(myMap.mySize());
console.log(myMap.entries().next().value);
function MapFactory(extensions = {}) {
const proto = new Map;
const mappings = Object.getOwnPropertyNames(Map.prototype)
.reduce( (reduced, key) => {
if (proto[key].constructor !== Function) {
reduced.localProps.push(key);
} else {
reduced.proto[key] = function (...args) { return this.map[key](...args); };
}
return reduced;
},
{ localProps: [], proto: {} }
);
const XMap = function (map) {
this.map = map;
mappings.localProps.forEach( prop =>
Object.defineProperty(this, prop, { get() {return this.map[prop]; }})
);
};
XMap.prototype = {...mappings.proto, ...extensions};
return { Create: (map = new Map) => new XMap(map) };
}
不仅限于/* develblock:start */
/* develblock:end */
,并且产品中没有多余的代码。
答案 4 :(得分:0)
我创建了一个sample project来评估该线程中解释的所有不同方法。我最喜欢的是使用string-replace-webpack-plugin。