'use strict' const path = require('path') const config = require('../config') const glob = require('glob'); const ExtractTextPlugin = require('extract-text-webpack-plugin') const packageConfig = require('../package.json') const theme = require('../src/assets/ant_theme/theme.json') const HtmlWebpackPlugin = require('html-webpack-plugin') exports.assetsPath = function(_path) { const assetsSubDirectory = process.env.NODE_ENV === 'production' ? config.build.assetsSubDirectory : config.dev.assetsSubDirectory return path.posix.join(assetsSubDirectory, _path) } exports.cssLoaders = function(options) { options = options || {} const cssLoader = { loader: 'css-loader', options: { sourceMap: options.sourceMap } } const postcssLoader = { loader: 'postcss-loader', options: { sourceMap: options.sourceMap } } // generate loader string to be used with extract text plugin function generateLoaders(loader, loaderOptions) { const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] if ('less' == loader) { if (loader) { loaders.push({ loader: loader + '-loader', options: Object.assign({}, loaderOptions, { sourceMap: options.sourceMap, javascriptEnabled: true, "modifyVars": theme }) }) } } else { if (loader) { loaders.push({ loader: loader + '-loader', options: Object.assign({}, loaderOptions, { sourceMap: options.sourceMap }) }) } } // Extract CSS when that option is specified // (which is the case during production build) if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader', publicPath: "../../" }) } else { return ['vue-style-loader'].concat(loaders) } } // https://vue-loader.vuejs.org/en/configurations/extract-css.html return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders('less'), sass: generateLoaders('sass', { indentedSyntax: true }), scss: generateLoaders('sass'), stylus: generateLoaders('stylus'), styl: generateLoaders('stylus') } } // Generate loaders for standalone style files (outside of .vue) 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 }) } return output } exports.createNotifierCallback = () => { const notifier = require('node-notifier') return (severity, errors) => { if (severity !== 'error') return const error = errors[0] const filename = error.file && error.file.split('!').pop() notifier.notify({ title: packageConfig.name, message: severity + ': ' + error.name, subtitle: filename || '', icon: path.join(__dirname, 'logo.png') }) } } /** * get entry for main entry and html template * @author: * @date:2015-08-20 */ exports.getEntry = () => { let globPath = 'src/entry/**/*.html' let pathDir = 'src/entry(\/|\\\\)(.*?)(\/|\\\\)html' // (\/|\\\\) 这种写法是为了兼容 windows和 mac系统目录路径的不同写法 let files = glob.sync(globPath) let dirname, entries = [] for (let i = 0; i < files.length; i++) { dirname = path.dirname(files[i]) entries.push(dirname.replace(new RegExp('^' + pathDir), '$2')) } return entries } exports.resolve = (dir) => { return path.join(__dirname, '..', dir) } /** * get entry for webpack config * @author: * @date:2015-08-20 */ exports.addEntry = () => { let entryObj = {} exports.getEntry().forEach(item => { const arr = item.split('/'); const key = arr[arr.length - 1]; entryObj[key] = exports.resolve(`${item}/index.js`) }) return entryObj } /** * webpack config for build * @author: * @date:2015-08-20 */ exports.getHtmlPlugins = () => { let result = []; exports.getEntry().forEach(item => { const arr = item.split('/'); const key = arr[arr.length - 1]; const one = new HtmlWebpackPlugin({ //filename: process.env.NODE_ENV === 'testing' ? 'index.html': `${key}.html`, filename: `${key}.html`, template: exports.resolve(`${item}/index.html`), inject: true, chunks: [key, 'manifest', 'vendor', 'app'], minify: { removeComments: true, collapseWhitespace: false, removeAttributeQuotes: true }, chunksSortMode: 'dependency' }); result.push(one); }) return result; } /** * webpack config for dev * @author: * @date:2015-08-20 */ exports.getDevHtmlPlugins = () => { let result = []; exports.getEntry().forEach(item => { const arr = item.split('/'); const key = arr[arr.length - 1]; const one = new HtmlWebpackPlugin({ //filename: process.env.NODE_ENV === 'testing' ? 'index.html': `${key}.html`, filename: `${key}.html`, template: exports.resolve(`${item}/index.html`), inject: true, minify: { removeComments: false, collapseWhitespace: false, removeAttributeQuotes: false }, chunks: [key, 'manifest', 'vendor', 'app'], chunksSortMode: 'dependency' }); result.push(one); }) return result; }