build 文件夹中的 utils.js

 

  1 //此文件用来配置 assetsPath css-loader 和 vue-style-loader createNotifierCallback
  2 'use strict'
  3 const path = require('path')
  4 const config = require('../config')
  5 const MiniCssExtractPlugin = require('mini-css-extract-plugin') //将CSS提取为独立的文件的插件,对每个包含css的js文件都会创建一个CSS文件
  6 const packageConfig = require('../package.json')
  7 
  8 // 导出assetsPath
  9 exports.assetsPath = function (_path) {
 10   const assetsSubDirectory = process.env.NODE_ENV === 'production' ?
 11     config.build.assetsSubDirectory :
 12     config.dev.assetsSubDirectory
 13 
 14   // path.posix是处理跨操作系统 path.join是用\拼接路径片
 15   return path.posix.join(assetsSubDirectory, _path)
 16 }
 17 
 18 // 导出lcssLoaders 该cssLoaders是为了下面的styleLoaders服务
 19 exports.cssLoaders = function (options) {
 20   options = options || {}
 21   // cssLoader基本配置
 22   const cssLoader = {
 23     // css-loader处理css
 24     loader: 'css-loader',
 25     options: {
 26       // 是否开启sourceMap 用来调试
 27       sourceMap: options.sourceMap
 28     }
 29   }
 30   // postcssLoader基本配置 用来添加浏览器前缀
 31   const postcssLoader = {
 32     loader: 'postcss-loader',
 33     options: {
 34       sourceMap: options.sourceMap
 35     }
 36   }
 37 
 38   // generate loader string to be used with extract text plugin
 39   function generateLoaders(loader, loaderOptions) {
 40     // 将上面的cssLoader放在一个数组中
 41     const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
 42     // 如果该函数传达了loader那就添加到loaders中,该loader可能是less/sass等
 43     if (loader) {
 44       loaders.push({
 45         // loader配置
 46         loader: loader + '-loader',
 47         // 参数配置 Object.assign是合并对象
 48         options: Object.assign({}, loaderOptions, {
 49           sourceMap: options.sourceMap
 50         })
 51       })
 52     }
 53 
 54     // 当指定该选项时提取CSS (生产构建期间的情况)
 55     if (options.extract) {
 56       //提取抽离css
 57       return [MiniCssExtractPlugin.loader].concat(loaders)
 58     } else {
 59       //不提取抽离css
 60       return ['vue-style-loader'].concat(loaders)
 61     }
 62   }
 63 
 64   // https://vue-loader.vuejs.org/en/configurations/extract-css.html
 65   return {
 66     css: generateLoaders(),
 67     postcss: generateLoaders(),
 68     less: generateLoaders('less'),
 69     sass: generateLoaders('sass', {
 70       indentedSyntax: true
 71     }),
 72     scss: generateLoaders('sass'),
 73     stylus: generateLoaders('stylus'),
 74     styl: generateLoaders('stylus')
 75   }
 76 }
 77 
 78 // 为独立样式文件生成 loader (.vue之外)
 79 exports.styleLoaders = function (options) {
 80   const output = []
 81   const loaders = exports.cssLoaders(options)
 82 
 83   for (const extension in loaders) {
 84     // 该loader是各种css文件生成的loader对象
 85     const loader = loaders[extension]
 86     output.push({
 87       // 用loader处理符合test正则的文件
 88       test: new RegExp('\\.' + extension + '$'),
 89       use: loader
 90     })
 91   }
 92 
 93   return output
 94 }
 95 
 96 exports.createNotifierCallback = () => {
 97   // 发送桌面消息
 98   const notifier = require('node-notifier')
 99 
100   return (severity, errors) => {
101     if (severity !== 'error') return
102 
103     const error = errors[0]
104     const filename = error.file && error.file.split('!').pop()
105 
106     notifier.notify({
107       title: packageConfig.name,
108       message: severity + ': ' + error.name,
109       subtitle: filename || '',
110       icon: path.join(__dirname, 'logo.png')
111     })
112   }
113 }

 

posted @ 2020-12-02 16:32  思猿客  阅读(1002)  评论(0编辑  收藏  举报