async base(buildConfig = {}) {
        let {globals, build} = this.config;
        /* eslint-disable fecs-one-var-per-line */
        let {path, publicPath, filenames, cssSourceMap, cssMinimize,
            cssExtract, jsSourceMap, babelOptions,
            alias: {base: baseAlias = {}},
            defines: {base: baseDefines = {}}
        } = Object.assign({}, build, buildConfig);
        /* eslint-enable fecs-one-var-per-line */

        let baseConfig = new WebpackChainConfig();

        // set output
        baseConfig.output
            .path(path)
            .publicPath(publicPath);

        // set extensions & alias
        baseConfig.resolve
            .extensions.add('.js').add('.vue').add('.json');
        let aliasObject = Object.assign({
            '@': globals.rootDir,
            '$': join(globals.rootDir, '.lavas')
        }, baseAlias);
        Object.keys(aliasObject).forEach(aliasKey => {
            baseConfig.resolve.alias.set(aliasKey, aliasObject[aliasKey]);
        });

        /**
         * set module rules
         */
        baseConfig.module.noParse(/es6-promise\.js$/);

        baseConfig.module.rule('vue')
            .test(/\.vue$/)
            .use('vue')
                .loader('vue-loader')
                .options(vueLoaders({
                    cssSourceMap,
                    cssMinimize,
                    cssExtract,
                    babelOptions
                }));

        baseConfig.module.rule('js')
            .test(/\.js$/)
            .use('babel')
                .loader('babel-loader')
                .options(babelOptions)
                .end()
            .exclude.add(/node_modules/);

        baseConfig.module.rule('img')
            .test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)
            .use('url')
                .loader('url-loader')
                .options({
                    limit: 10000,
                    name: assetsPath(filenames.img)
                });

        baseConfig.module.rule('font')
            .test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/)
            .use('url')
                .loader('url-loader')
                .options({
                    limit: 10000,
                    name: assetsPath(filenames.fonts)
                });

        /**
         * set plugins
         */
        baseConfig.plugin('define').use(webpack.DefinePlugin, [baseDefines]);

        if (cssExtract) {
            baseConfig.plugin('extract-css').use(ExtractTextPlugin, [{
                filename: assetsPath(filenames.css)
            }]);
        }

        // https://github.com/clessg/progress-bar-webpack-plugin#options
        baseConfig.plugin('progress-bar').use(ProgressBarPlugin, [{
            format: '  [:bar] ' + chalk.green.bold(':percent') + ' (:elapsed seconds)',
            clear: false
        }]);

        if (this.isProd) {
            // enable scope hoisting
            baseConfig.plugin('module-concatenation').use(webpack.optimize.ModuleConcatenationPlugin);

            // https://webpack.js.org/plugins/hashed-module-ids-plugin
            baseConfig.plugin('hashed-module-ids').use(webpack.HashedModuleIdsPlugin);

            // https://github.com/lavas-project/lavas/issues/77
            baseConfig.plugin('uglify-js').use(UglifyJSPlugin, [{
                parallel: true, // enable `parallel` option
                sourceMap: jsSourceMap
            }]);

            baseConfig.plugin('optimize-css').use(OptimizeCSSPlugin, [{
                cssProcessorOptions: {
                    safe: true
                }
            }]);
        }
        else {
            // fix watchpack time problem
            baseConfig.plugin('time-fix').use(TimeFixWebpackPlugin);

            // https://webpack.js.org/plugins/named-modules-plugin
            baseConfig.plugin('named-modules').use(webpack.NamedModulesPlugin);

            baseConfig.plugin('friendly-error').use(FriendlyErrorsPlugin);
        }

        // return a webpackChain object
        return baseConfig;
    }
generate webpack base config based on lavas config

@param {Object} buildConfig build config
@return {Object} webpackChain config