浅谈Vue-cli 命令行工具分析(2)
build Webpack配置
build |- utils.js #代码段 |- webpack.base.conf.js #基础配置文件 |- webpack.dev.conf.js #开发模式配置文件 |- webpack.prod.conf.js #生产模式配置文件 |- build.js #编译入口
实用代码段 utils.js
const config = require('../config')
const path = require('path')
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory // 'static'
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path) // posix方法修正路径
}
exports.cssLoaders = function (options) { // 示例: ({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
options = options || {};
// cssLoader
const cssLoader = {
loader: 'css-loader',
options: { sourceMap: options.sourceMap }
}
// postcssLoader
var postcssLoader = {
loader: 'postcss-loader',
options: { sourceMap: options.sourceMap }
}
// 生成 loader
function generateLoaders (loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] // 设置默认loader
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, { // 生成 options 对象
sourceMap: options.sourceMap
})
})
}
// 生产模式中提取css
if (options.extract) { // 如果 options 中的 extract 为 true 配合生产模式
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader' // 默认使用 vue-style-loader
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
return { // 返回各种 loaders 对象
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
// 示例:[
// { loader: 'css-loader', options: { sourceMap: true/false } },
// { loader: 'postcss-loader', options: { sourceMap: true/false } },
// { loader: 'less-loader', options: { sourceMap: true/false } },
// ]
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
exports.styleLoaders = function (options) {
const output = [];
const loaders = exports.cssLoaders(options);
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
// 示例:
// {
// test: new RegExp(\\.less$),
// use: {
// loader: 'less-loader', options: { sourceMap: true/false }
// }
// }
}
return output
}
exports.createNotifierCallback = function () { // 配合 friendly-errors-webpack-plugin
// 基本用法:notifier.notify('message');
const notifier = require('node-notifier'); // 发送跨平台通知系统
return (severity, errors) => {
// 当前设定是只有出现 error 错误时触发 notifier 发送通知
if (severity !== 'error') { return } // 严重程度可以是 'error' 或 'warning'
const error = errors[0]
const filename = error.file && error.file.split('!').pop();
notifier.notify({
title: pkg.name,
message: severity + ': ' + error.name,
subtitle: filename || ''
// icon: path.join(__dirname, 'logo.png') // 通知图标
})
}
}
内容版权声明:除非注明,否则皆为本站原创文章。
