关于webpack:webpack封装配置详解

utils.js

// utils.js文件次要是用来解决各种css loader的,比方css-loader,less-loader等。
// 引入path模块
const path = require('path')
// 引入之前的config模块
const config = require('../config')
// 引入"extract-text-webpack-plugin"它的作用是打包后将生成的css文件通过link的形式引入到html中,如果不应用这个插件,那么css就打包到<head>的style中
const ExtractTextPlugin = require('extract-text-webpack-plugin')
// 引入package.json
const pkg = require('../package.json')
exports.assetsSubDirectory = function (_path) {
    // 联合config文件的代码能够晓得 当环境为生产环境时 assetsSubDirectory为static开发环境也是static
  const assetsSubDirectory =
    progress.env.NODE_ENV === 'production'
      ? config.build.assetsSubDirectory
      : config.dev.assetsSubDirectory
    //   path.posix.join()是path.join的一种兼容写法 它的作用是门路的拼接 比方path.posix.join('/aa/s','bb')
      return path.posix.join(assetsSubDirectory,_path)
}
// 用来生成Loader的函数,自身能够用在vue-loader的配置上,同时也是为styleLoader函数应用

exports.cssLoaders = function(options){
    // 如果没有传参就默认空对象
    options = options||{}
    // 配置css-loader,css-loader能够让解决css中的@import或者url()
    const cssLoader = {
        loader:'css-loader',
        options:{
            sourceMap:options.sourceMap
        }
    }
    // 配置postcss-loader,次要性能是补全css中的兼容性前缀  比方“-webkit-”等
    var postcssLoader = {
        loader:"postcss-laoder",
        options:{
            sourceMap:options.sourceMap
        }
    }
    
    // 生成loader的公有办法
    function generateLoaders(loader,loaderOptions){
        // 参数的usePostCss属性是否为true 是就应用两个loader,否则只应用css-loader
        const loaders = options.usePostCSS? [cssLoader,postcssLoader]:[cssLoader]
        if(loader){
            // 给generateLoaders传loader参数的话 比方less 或者sass 就将这个loader的配置传入到loaders数组中
            loaders.push({
                loader:loader+'-loader',
                // Object.assign()是es6的语法  用来合并对象
                options: Object.assign({}, loaderOptions, {
                    sourceMap: options.sourceMap
                  })
            })
        }
// 如果options参数的extract属性为true  即应用extract text plugin   将css抽成独自的文件  否则就将css写进style     
        if(options.extract){
            return ExtractTextPlugin.extract({
                use:loaders,
                // vue-style-loader能够了解为vue版的style-loader  它可将css放进style中
                fallback:'vue-style-loader'
            })
            
        }else{
            return ['vue-style-loader'].concat('loaders')
        }

    }
    return {
        // 返回各种loader
        css:generateLoaders(),
        postcss:generateLoaders(),
        less:generateLoaders('less'),
        sass:generateLoaders('sass',{indentedSyntax:true}),
        scss:generateLoaders('sass'),
        stylus:generateLoaders('stylus'),
        styl:generateLoaders('stylus')
    }
}

// 生成开发环境下的loader的配置,应用在(webpack.dev.config.js中)
exports.styleLoaders = function(options){
    const output = []
    // 调用cssLoader办法 返回loaders的对象
    const loaders = exports.cssLoaders(options)
    // 遍历每一个loader 并配置成对应的格局  传给output数组
    for(const extension in loaders){
        const loader = loaders[extension]
        output.push({
            test:new RegExp('\\.'+extension + '$'),
            use:loader
        })
    }
    return output
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理