docs: function jsBrowserReporter (errors) {
  	var isGecko = !!window.netscape;
  
  	var throwError = isGecko ? function (message, stack, err) {
  		stack = stack.map((uri) => {
  			return '@' + uri;
  		});
  		if (!err.severity || err.severity === 'error') {
  			var error = new (window.SyntaxError || Error)(message);
  			error.columnNumber = err.columnNumber;
  			error.fileName = err.fileName;
  			error.lineNumber = err.lineNumber;
  			error.stack = stack.join('\n');
  			setTimeout(() => {
  				throw error;
  			}, 0);
  		} else {
  			consoleError(message, stack, err);
  		}
  	} : function (message, stack, err) {
  		stack = stack.map((uri) => {
  			return '    at ' + uri;
  		});
  		consoleError(message, stack, err);
  	};
  
  	function consoleError (message, stack, err) {
  		stack.unshift(err.name + ': ' + message);
  		stack = stack.join('\n');
  		var level = err.demote ? 'log' : (err.severity in console ? err.severity : 'error');
  		console[level](stack);
  	}
  
  	// 将文件路径与模块路径拼接为完整的url
  	errors.forEach((err) => {
  		var message = err.message + ' (' + [
  			err.plugin,
  			err.rule,
  		].filter(Boolean).join(' ') + ')';
  		var stack = [
  			[
  				'file://' + err.fileName.replace(/^(\w:)\\/, '/$1/').replace(/\\/g, '/'),
  				err.lineNumber,
  				err.columnNumber,
  			].filter(Boolean).join(':'),
  		];
  		if (err.doc) {
  			stack.push(err.doc);
  		}
  
  		throwError(message, stack, err);
  	});
  }