UNPKG

wox-cli

Version:

scaffold for create component, toolkit and so on

187 lines (170 loc) 4.84 kB
'use strict'; const path = require('path'); const fs = require('fs'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); function resolve (dir) { return path.join(__dirname, '.', dir); } module.exports = { context: path.resolve(__dirname, './'), entry: { app: ['babel-polyfill', './src/main.js'] }, output: { path: path.resolve(__dirname, './dist'), filename: '[name].js', publicPath: '/' }, resolve: { extensions: ['.js', '.vue', '.json'], alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src'), } }, module: { rules: [ { test: /\.(js|vue)$/, loader: 'eslint-loader', enforce: 'pre', include: [resolve('src'), resolve('test')], options: { formatter: require('eslint-friendly-formatter'), emitWarning: true } }, { test: /\.vue$/, loader: 'vue-loader', options: { loaders: cssLoaders({ sourceMap: true, extract: process.env.NODE_ENV === 'production' }), cssSourceMap: true, cacheBusting: true, transformToRequire: { video: ['src', 'poster'], source: 'src', img: 'src', image: 'xlink:href' } } }, { test: /\.js$/, loader: 'babel-loader', include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 1024, name: 'images/[name].[hash:7].[ext]' } }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { limit: 1024, name: 'media/[name].[hash:7].[ext]' } }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { limit: 1024, name: 'fonts/[name].[hash:7].[ext]' } }, { test: /\.less$/, loader: "style-loader!css-loader!less-loader", } ].concat(process.env.NODE_ENV === 'production' ? styleLoaders({sourceMap: true, usePostCSS: true, extract: true}) : styleLoaders({sourceMap: true, usePostCSS: true})) }, node: { // prevent webpack from injecting useless setImmediate polyfill because Vue // source contains it (although only uses it if it's native). setImmediate: false, // prevent webpack from injecting mocks to Node native modules // that does not make sense for the client dgram: 'empty', fs: 'empty', net: 'empty', tls: 'empty', child_process: 'empty' } }; // utils function cssLoaders(options) { options = options || {}; const cssLoader = { loader: 'css-loader', options: { sourceMap: options.sourceMap, alias: { './@': path.resolve(__dirname, './src') } } }; 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 (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) { const currentDir = __dirname.substr(__dirname.lastIndexOf('/') + 1); let gitVersion = fs.readFileSync(path.resolve(__dirname, './.git/HEAD'), 'utf8'); gitVersion = gitVersion.split('/heads/')[1].replace(/\s/g, ''); const versionNum = gitVersion.split('/')[1]; return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader', publicPath: `//www.quimg.com/${currentDir}/${versionNum}` }); } 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') }; } function styleLoaders(options) { const output = []; const loaders = cssLoaders(options); for (const extension in loaders) { const loader = loaders[extension]; output.push({ test: new RegExp('\\.' + extension + '$'), use: loader }); } return output; }