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 }