Commit 87277c1ebb22cba06e53a8a920ce0bb9a5cff8f6
0 parents
20190516
Showing
20 changed files
with
810 additions
and
0 deletions
Too many changes to show.
To preserve performance only 20 of 78 files are displayed.
.babelrc
0 → 100644
| 1 | +++ a/.babelrc | ||
| 1 | +{ | ||
| 2 | + "presets": [ | ||
| 3 | + ["env", { | ||
| 4 | + "modules": false, | ||
| 5 | + "targets": { | ||
| 6 | + "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] | ||
| 7 | + } | ||
| 8 | + }], | ||
| 9 | + "stage-2" | ||
| 10 | + ], | ||
| 11 | + "plugins": ["transform-vue-jsx", "transform-runtime"], | ||
| 12 | + "env": { | ||
| 13 | + "test": { | ||
| 14 | + "presets": ["env", "stage-2"] | ||
| 15 | + } | ||
| 16 | + } | ||
| 17 | +} |
.editorconfig
0 → 100644
.eslintignore
0 → 100644
.eslintrc.js
0 → 100644
| 1 | +++ a/.eslintrc.js | ||
| 1 | +// https://eslint.org/docs/user-guide/configuring | ||
| 2 | + | ||
| 3 | +module.exports = { | ||
| 4 | + root: true, | ||
| 5 | + parserOptions: { | ||
| 6 | + parser: 'babel-eslint' | ||
| 7 | + }, | ||
| 8 | + env: { | ||
| 9 | + browser: true, | ||
| 10 | + }, | ||
| 11 | + extends: [ | ||
| 12 | + // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention | ||
| 13 | + // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. | ||
| 14 | + 'plugin:vue/essential', | ||
| 15 | + // https://github.com/standard/standard/blob/master/docs/RULES-en.md | ||
| 16 | + 'standard' | ||
| 17 | + ], | ||
| 18 | + // required to lint *.vue files | ||
| 19 | + plugins: [ | ||
| 20 | + 'vue' | ||
| 21 | + ], | ||
| 22 | + // add your custom rules here | ||
| 23 | + rules: { | ||
| 24 | + // allow async-await | ||
| 25 | + 'generator-star-spacing': 'off', | ||
| 26 | + // allow debugger during development | ||
| 27 | + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' | ||
| 28 | + } | ||
| 29 | +} |
.gitignore
0 → 100644
.postcssrc.js
0 → 100644
README.md
0 → 100644
| 1 | +++ a/README.md | ||
| 1 | +# huipro | ||
| 2 | + | ||
| 3 | +> A Vue.js project | ||
| 4 | + | ||
| 5 | +## Build Setup | ||
| 6 | + | ||
| 7 | +``` bash | ||
| 8 | +# install dependencies | ||
| 9 | +npm install | ||
| 10 | + | ||
| 11 | +# serve with hot reload at localhost:8080 | ||
| 12 | +npm run dev | ||
| 13 | + | ||
| 14 | +# build for production with minification | ||
| 15 | +npm run build | ||
| 16 | + | ||
| 17 | +# build for production and view the bundle analyzer report | ||
| 18 | +npm run build --report | ||
| 19 | + | ||
| 20 | +# run e2e tests | ||
| 21 | +npm run e2e | ||
| 22 | + | ||
| 23 | +# run all tests | ||
| 24 | +npm test | ||
| 25 | +``` | ||
| 26 | + | ||
| 27 | +For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). |
build/build.js
0 → 100644
| 1 | +++ a/build/build.js | ||
| 1 | +'use strict' | ||
| 2 | +require('./check-versions')() | ||
| 3 | + | ||
| 4 | +process.env.NODE_ENV = 'production' | ||
| 5 | + | ||
| 6 | +const ora = require('ora') | ||
| 7 | +const rm = require('rimraf') | ||
| 8 | +const path = require('path') | ||
| 9 | +const chalk = require('chalk') | ||
| 10 | +const webpack = require('webpack') | ||
| 11 | +const config = require('../config') | ||
| 12 | +const webpackConfig = require('./webpack.prod.conf') | ||
| 13 | + | ||
| 14 | +const spinner = ora('building for production...') | ||
| 15 | +spinner.start() | ||
| 16 | + | ||
| 17 | +rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { | ||
| 18 | + if (err) throw err | ||
| 19 | + webpack(webpackConfig, (err, stats) => { | ||
| 20 | + spinner.stop() | ||
| 21 | + if (err) throw err | ||
| 22 | + process.stdout.write(stats.toString({ | ||
| 23 | + colors: true, | ||
| 24 | + modules: false, | ||
| 25 | + children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. | ||
| 26 | + chunks: false, | ||
| 27 | + chunkModules: false | ||
| 28 | + }) + '\n\n') | ||
| 29 | + | ||
| 30 | + if (stats.hasErrors()) { | ||
| 31 | + console.log(chalk.red(' Build failed with errors.\n')) | ||
| 32 | + process.exit(1) | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + console.log(chalk.cyan(' Build complete.\n')) | ||
| 36 | + console.log(chalk.yellow( | ||
| 37 | + ' Tip: built files are meant to be served over an HTTP server.\n' + | ||
| 38 | + ' Opening index.html over file:// won\'t work.\n' | ||
| 39 | + )) | ||
| 40 | + }) | ||
| 41 | +}) |
build/check-versions.js
0 → 100644
| 1 | +++ a/build/check-versions.js | ||
| 1 | +'use strict' | ||
| 2 | +const chalk = require('chalk') | ||
| 3 | +const semver = require('semver') | ||
| 4 | +const packageConfig = require('../package.json') | ||
| 5 | +const shell = require('shelljs') | ||
| 6 | + | ||
| 7 | +function exec (cmd) { | ||
| 8 | + return require('child_process').execSync(cmd).toString().trim() | ||
| 9 | +} | ||
| 10 | + | ||
| 11 | +const versionRequirements = [ | ||
| 12 | + { | ||
| 13 | + name: 'node', | ||
| 14 | + currentVersion: semver.clean(process.version), | ||
| 15 | + versionRequirement: packageConfig.engines.node | ||
| 16 | + } | ||
| 17 | +] | ||
| 18 | + | ||
| 19 | +if (shell.which('npm')) { | ||
| 20 | + versionRequirements.push({ | ||
| 21 | + name: 'npm', | ||
| 22 | + currentVersion: exec('npm --version'), | ||
| 23 | + versionRequirement: packageConfig.engines.npm | ||
| 24 | + }) | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +module.exports = function () { | ||
| 28 | + const warnings = [] | ||
| 29 | + | ||
| 30 | + for (let i = 0; i < versionRequirements.length; i++) { | ||
| 31 | + const mod = versionRequirements[i] | ||
| 32 | + | ||
| 33 | + if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { | ||
| 34 | + warnings.push(mod.name + ': ' + | ||
| 35 | + chalk.red(mod.currentVersion) + ' should be ' + | ||
| 36 | + chalk.green(mod.versionRequirement) | ||
| 37 | + ) | ||
| 38 | + } | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + if (warnings.length) { | ||
| 42 | + console.log('') | ||
| 43 | + console.log(chalk.yellow('To use this template, you must update following to modules:')) | ||
| 44 | + console.log() | ||
| 45 | + | ||
| 46 | + for (let i = 0; i < warnings.length; i++) { | ||
| 47 | + const warning = warnings[i] | ||
| 48 | + console.log(' ' + warning) | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + console.log() | ||
| 52 | + process.exit(1) | ||
| 53 | + } | ||
| 54 | +} |
build/logo.png
0 → 100644
6.69 KB
build/utils.js
0 → 100644
| 1 | +++ a/build/utils.js | ||
| 1 | +'use strict' | ||
| 2 | +const path = require('path') | ||
| 3 | +const config = require('../config') | ||
| 4 | +const ExtractTextPlugin = require('extract-text-webpack-plugin') | ||
| 5 | +const packageConfig = require('../package.json') | ||
| 6 | + | ||
| 7 | +exports.assetsPath = function (_path) { | ||
| 8 | + const assetsSubDirectory = process.env.NODE_ENV === 'production' | ||
| 9 | + ? config.build.assetsSubDirectory | ||
| 10 | + : config.dev.assetsSubDirectory | ||
| 11 | + | ||
| 12 | + return path.posix.join(assetsSubDirectory, _path) | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +exports.cssLoaders = function (options) { | ||
| 16 | + options = options || {} | ||
| 17 | + | ||
| 18 | + const cssLoader = { | ||
| 19 | + loader: 'css-loader', | ||
| 20 | + options: { | ||
| 21 | + sourceMap: options.sourceMap | ||
| 22 | + } | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + const postcssLoader = { | ||
| 26 | + loader: 'postcss-loader', | ||
| 27 | + options: { | ||
| 28 | + sourceMap: options.sourceMap | ||
| 29 | + } | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + // generate loader string to be used with extract text plugin | ||
| 33 | + function generateLoaders (loader, loaderOptions) { | ||
| 34 | + const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] | ||
| 35 | + | ||
| 36 | + if (loader) { | ||
| 37 | + loaders.push({ | ||
| 38 | + loader: loader + '-loader', | ||
| 39 | + options: Object.assign({}, loaderOptions, { | ||
| 40 | + sourceMap: options.sourceMap | ||
| 41 | + }) | ||
| 42 | + }) | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + // Extract CSS when that option is specified | ||
| 46 | + // (which is the case during production build) | ||
| 47 | + if (options.extract) { | ||
| 48 | + return ExtractTextPlugin.extract({ | ||
| 49 | + use: loaders, | ||
| 50 | + fallback: 'vue-style-loader' | ||
| 51 | + }) | ||
| 52 | + } else { | ||
| 53 | + return ['vue-style-loader'].concat(loaders) | ||
| 54 | + } | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + // https://vue-loader.vuejs.org/en/configurations/extract-css.html | ||
| 58 | + return { | ||
| 59 | + css: generateLoaders(), | ||
| 60 | + postcss: generateLoaders(), | ||
| 61 | + less: generateLoaders('less'), | ||
| 62 | + sass: generateLoaders('sass', { indentedSyntax: true }), | ||
| 63 | + scss: generateLoaders('sass'), | ||
| 64 | + stylus: generateLoaders('stylus'), | ||
| 65 | + styl: generateLoaders('stylus') | ||
| 66 | + } | ||
| 67 | +} | ||
| 68 | + | ||
| 69 | +// Generate loaders for standalone style files (outside of .vue) | ||
| 70 | +exports.styleLoaders = function (options) { | ||
| 71 | + const output = [] | ||
| 72 | + const loaders = exports.cssLoaders(options) | ||
| 73 | + | ||
| 74 | + for (const extension in loaders) { | ||
| 75 | + const loader = loaders[extension] | ||
| 76 | + output.push({ | ||
| 77 | + test: new RegExp('\\.' + extension + '$'), | ||
| 78 | + use: loader | ||
| 79 | + }) | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + return output | ||
| 83 | +} | ||
| 84 | + | ||
| 85 | +exports.createNotifierCallback = () => { | ||
| 86 | + const notifier = require('node-notifier') | ||
| 87 | + | ||
| 88 | + return (severity, errors) => { | ||
| 89 | + if (severity !== 'error') return | ||
| 90 | + | ||
| 91 | + const error = errors[0] | ||
| 92 | + const filename = error.file && error.file.split('!').pop() | ||
| 93 | + | ||
| 94 | + notifier.notify({ | ||
| 95 | + title: packageConfig.name, | ||
| 96 | + message: severity + ': ' + error.name, | ||
| 97 | + subtitle: filename || '', | ||
| 98 | + icon: path.join(__dirname, 'logo.png') | ||
| 99 | + }) | ||
| 100 | + } | ||
| 101 | +} |
build/vue-loader.conf.js
0 → 100644
| 1 | +++ a/build/vue-loader.conf.js | ||
| 1 | +'use strict' | ||
| 2 | +const utils = require('./utils') | ||
| 3 | +const config = require('../config') | ||
| 4 | +const isProduction = process.env.NODE_ENV === 'production' | ||
| 5 | +const sourceMapEnabled = isProduction | ||
| 6 | + ? config.build.productionSourceMap | ||
| 7 | + : config.dev.cssSourceMap | ||
| 8 | + | ||
| 9 | +module.exports = { | ||
| 10 | + loaders: utils.cssLoaders({ | ||
| 11 | + sourceMap: sourceMapEnabled, | ||
| 12 | + extract: isProduction | ||
| 13 | + }), | ||
| 14 | + cssSourceMap: sourceMapEnabled, | ||
| 15 | + cacheBusting: config.dev.cacheBusting, | ||
| 16 | + transformToRequire: { | ||
| 17 | + video: ['src', 'poster'], | ||
| 18 | + source: 'src', | ||
| 19 | + img: 'src', | ||
| 20 | + image: 'xlink:href' | ||
| 21 | + } | ||
| 22 | +} |
build/webpack.base.conf.js
0 → 100644
| 1 | +++ a/build/webpack.base.conf.js | ||
| 1 | +'use strict' | ||
| 2 | +const path = require('path') | ||
| 3 | +const utils = require('./utils') | ||
| 4 | +const config = require('../config') | ||
| 5 | +const vueLoaderConfig = require('./vue-loader.conf') | ||
| 6 | +var webpack = require("webpack") | ||
| 7 | + | ||
| 8 | +function resolve (dir) { | ||
| 9 | + return path.join(__dirname, '..', dir) | ||
| 10 | +} | ||
| 11 | + | ||
| 12 | +const createLintingRule = () => ({ | ||
| 13 | + // test: /\.(js|vue)$/, | ||
| 14 | + // loader: 'eslint-loader', | ||
| 15 | + // enforce: 'pre', | ||
| 16 | + // include: [resolve('src'), resolve('test')], | ||
| 17 | + // options: { | ||
| 18 | + // formatter: require('eslint-friendly-formatter'), | ||
| 19 | + // emitWarning: !config.dev.showEslintErrorsInOverlay | ||
| 20 | + // } | ||
| 21 | +}) | ||
| 22 | + | ||
| 23 | +module.exports = { | ||
| 24 | + context: path.resolve(__dirname, '../'), | ||
| 25 | + entry: { | ||
| 26 | + app: './src/main.js' | ||
| 27 | + }, | ||
| 28 | + output: { | ||
| 29 | + path: config.build.assetsRoot, | ||
| 30 | + filename: '[name].js', | ||
| 31 | + publicPath: process.env.NODE_ENV === 'production' | ||
| 32 | + ? config.build.assetsPublicPath | ||
| 33 | + : config.dev.assetsPublicPath | ||
| 34 | + }, | ||
| 35 | + resolve: { | ||
| 36 | + extensions: ['.js', '.vue', '.json'], | ||
| 37 | + alias: { | ||
| 38 | + 'vue$': 'vue/dist/vue.esm.js', | ||
| 39 | + '@': resolve('src'), | ||
| 40 | + 'pages':resolve('src/pages'), | ||
| 41 | + 'styles': resolve('src/assets/styles'), | ||
| 42 | + } | ||
| 43 | + }, | ||
| 44 | + module: { | ||
| 45 | + rules: [ | ||
| 46 | + // ...(config.dev.useEslint ? [createLintingRule()] : []), | ||
| 47 | + { | ||
| 48 | + test: /\.vue$/, | ||
| 49 | + loader: 'vue-loader', | ||
| 50 | + options: vueLoaderConfig | ||
| 51 | + }, | ||
| 52 | + { | ||
| 53 | + test: /\.js$/, | ||
| 54 | + loader: 'babel-loader', | ||
| 55 | + include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] | ||
| 56 | + }, | ||
| 57 | + { | ||
| 58 | + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, | ||
| 59 | + loader: 'url-loader', | ||
| 60 | + options: { | ||
| 61 | + limit: 10000, | ||
| 62 | + name: utils.assetsPath('img/[name].[hash:7].[ext]') | ||
| 63 | + } | ||
| 64 | + }, | ||
| 65 | + { | ||
| 66 | + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, | ||
| 67 | + loader: 'url-loader', | ||
| 68 | + options: { | ||
| 69 | + limit: 10000, | ||
| 70 | + name: utils.assetsPath('media/[name].[hash:7].[ext]') | ||
| 71 | + } | ||
| 72 | + }, | ||
| 73 | + { | ||
| 74 | + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, | ||
| 75 | + loader: 'url-loader', | ||
| 76 | + options: { | ||
| 77 | + limit: 10000, | ||
| 78 | + name: utils.assetsPath('fonts/[name].[hash:7].[ext]') | ||
| 79 | + } | ||
| 80 | + } | ||
| 81 | + ] | ||
| 82 | + }, | ||
| 83 | + node: { | ||
| 84 | + // prevent webpack from injecting useless setImmediate polyfill because Vue | ||
| 85 | + // source contains it (although only uses it if it's native). | ||
| 86 | + setImmediate: false, | ||
| 87 | + // prevent webpack from injecting mocks to Node native modules | ||
| 88 | + // that does not make sense for the client | ||
| 89 | + dgram: 'empty', | ||
| 90 | + fs: 'empty', | ||
| 91 | + net: 'empty', | ||
| 92 | + tls: 'empty', | ||
| 93 | + child_process: 'empty' | ||
| 94 | + }, | ||
| 95 | + plugins: [ | ||
| 96 | + new webpack.optimize.CommonsChunkPlugin('common.js'), | ||
| 97 | + new webpack.ProvidePlugin({ | ||
| 98 | + jQuery: "jquery", | ||
| 99 | + $: "jquery" | ||
| 100 | + }) | ||
| 101 | + ] | ||
| 102 | +} |
build/webpack.dev.conf.js
0 → 100755
| 1 | +++ a/build/webpack.dev.conf.js | ||
| 1 | +'use strict' | ||
| 2 | +const utils = require('./utils') | ||
| 3 | +const webpack = require('webpack') | ||
| 4 | +const config = require('../config') | ||
| 5 | +const merge = require('webpack-merge') | ||
| 6 | +const path = require('path') | ||
| 7 | +const baseWebpackConfig = require('./webpack.base.conf') | ||
| 8 | +const CopyWebpackPlugin = require('copy-webpack-plugin') | ||
| 9 | +const HtmlWebpackPlugin = require('html-webpack-plugin') | ||
| 10 | +const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') | ||
| 11 | +const portfinder = require('portfinder') | ||
| 12 | + | ||
| 13 | +const HOST = process.env.HOST | ||
| 14 | +const PORT = process.env.PORT && Number(process.env.PORT) | ||
| 15 | + | ||
| 16 | +const devWebpackConfig = merge(baseWebpackConfig, { | ||
| 17 | + module: { | ||
| 18 | + rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) | ||
| 19 | + }, | ||
| 20 | + // cheap-module-eval-source-map is faster for development | ||
| 21 | + devtool: config.dev.devtool, | ||
| 22 | + | ||
| 23 | + // these devServer options should be customized in /config/index.js | ||
| 24 | + devServer: { | ||
| 25 | + clientLogLevel: 'warning', | ||
| 26 | + historyApiFallback: { | ||
| 27 | + rewrites: [ | ||
| 28 | + { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, | ||
| 29 | + ], | ||
| 30 | + }, | ||
| 31 | + hot: true, | ||
| 32 | + contentBase: false, // since we use CopyWebpackPlugin. | ||
| 33 | + compress: true, | ||
| 34 | + host: HOST || config.dev.host, | ||
| 35 | + port: PORT || config.dev.port, | ||
| 36 | + open: config.dev.autoOpenBrowser, | ||
| 37 | + overlay: config.dev.errorOverlay | ||
| 38 | + ? { warnings: false, errors: true } | ||
| 39 | + : false, | ||
| 40 | + publicPath: config.dev.assetsPublicPath, | ||
| 41 | + proxy: config.dev.proxyTable, | ||
| 42 | + quiet: true, // necessary for FriendlyErrorsPlugin | ||
| 43 | + watchOptions: { | ||
| 44 | + poll: config.dev.poll, | ||
| 45 | + } | ||
| 46 | + }, | ||
| 47 | + plugins: [ | ||
| 48 | + new webpack.DefinePlugin({ | ||
| 49 | + 'process.env': require('../config/dev.env') | ||
| 50 | + }), | ||
| 51 | + new webpack.HotModuleReplacementPlugin(), | ||
| 52 | + new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. | ||
| 53 | + new webpack.NoEmitOnErrorsPlugin(), | ||
| 54 | + // https://github.com/ampedandwired/html-webpack-plugin | ||
| 55 | + new HtmlWebpackPlugin({ | ||
| 56 | + filename: 'index.html', | ||
| 57 | + template: 'index.html', | ||
| 58 | + inject: true | ||
| 59 | + }), | ||
| 60 | + // copy custom static assets | ||
| 61 | + new CopyWebpackPlugin([ | ||
| 62 | + { | ||
| 63 | + from: path.resolve(__dirname, '../static'), | ||
| 64 | + to: config.dev.assetsSubDirectory, | ||
| 65 | + ignore: ['.*'] | ||
| 66 | + } | ||
| 67 | + ]) | ||
| 68 | + ] | ||
| 69 | +}) | ||
| 70 | + | ||
| 71 | +module.exports = new Promise((resolve, reject) => { | ||
| 72 | + portfinder.basePort = process.env.PORT || config.dev.port | ||
| 73 | + portfinder.getPort((err, port) => { | ||
| 74 | + if (err) { | ||
| 75 | + reject(err) | ||
| 76 | + } else { | ||
| 77 | + // publish the new Port, necessary for e2e tests | ||
| 78 | + process.env.PORT = port | ||
| 79 | + // add port to devServer config | ||
| 80 | + devWebpackConfig.devServer.port = port | ||
| 81 | + | ||
| 82 | + // Add FriendlyErrorsPlugin | ||
| 83 | + devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ | ||
| 84 | + compilationSuccessInfo: { | ||
| 85 | + messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], | ||
| 86 | + }, | ||
| 87 | + onErrors: config.dev.notifyOnErrors | ||
| 88 | + ? utils.createNotifierCallback() | ||
| 89 | + : undefined | ||
| 90 | + })) | ||
| 91 | + | ||
| 92 | + resolve(devWebpackConfig) | ||
| 93 | + } | ||
| 94 | + }) | ||
| 95 | +}) |
build/webpack.prod.conf.js
0 → 100644
| 1 | +++ a/build/webpack.prod.conf.js | ||
| 1 | +'use strict' | ||
| 2 | +const path = require('path') | ||
| 3 | +const utils = require('./utils') | ||
| 4 | +const webpack = require('webpack') | ||
| 5 | +const config = require('../config') | ||
| 6 | +const merge = require('webpack-merge') | ||
| 7 | +const baseWebpackConfig = require('./webpack.base.conf') | ||
| 8 | +const CopyWebpackPlugin = require('copy-webpack-plugin') | ||
| 9 | +const HtmlWebpackPlugin = require('html-webpack-plugin') | ||
| 10 | +const ExtractTextPlugin = require('extract-text-webpack-plugin') | ||
| 11 | +const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') | ||
| 12 | +const UglifyJsPlugin = require('uglifyjs-webpack-plugin') | ||
| 13 | + | ||
| 14 | +const env = process.env.NODE_ENV === 'testing' | ||
| 15 | + ? require('../config/test.env') | ||
| 16 | + : require('../config/prod.env') | ||
| 17 | + | ||
| 18 | +const webpackConfig = merge(baseWebpackConfig, { | ||
| 19 | + module: { | ||
| 20 | + rules: utils.styleLoaders({ | ||
| 21 | + sourceMap: config.build.productionSourceMap, | ||
| 22 | + extract: true, | ||
| 23 | + usePostCSS: true | ||
| 24 | + }) | ||
| 25 | + }, | ||
| 26 | + devtool: config.build.productionSourceMap ? config.build.devtool : false, | ||
| 27 | + output: { | ||
| 28 | + path: config.build.assetsRoot, | ||
| 29 | + filename: utils.assetsPath('js/[name].[chunkhash].js'), | ||
| 30 | + chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') | ||
| 31 | + }, | ||
| 32 | + plugins: [ | ||
| 33 | + // http://vuejs.github.io/vue-loader/en/workflow/production.html | ||
| 34 | + new webpack.DefinePlugin({ | ||
| 35 | + 'process.env': env | ||
| 36 | + }), | ||
| 37 | + new UglifyJsPlugin({ | ||
| 38 | + uglifyOptions: { | ||
| 39 | + compress: { | ||
| 40 | + warnings: false | ||
| 41 | + } | ||
| 42 | + }, | ||
| 43 | + sourceMap: config.build.productionSourceMap, | ||
| 44 | + parallel: true | ||
| 45 | + }), | ||
| 46 | + // extract css into its own file | ||
| 47 | + new ExtractTextPlugin({ | ||
| 48 | + filename: utils.assetsPath('css/[name].[contenthash].css'), | ||
| 49 | + // Setting the following option to `false` will not extract CSS from codesplit chunks. | ||
| 50 | + // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. | ||
| 51 | + // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, | ||
| 52 | + // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 | ||
| 53 | + allChunks: true, | ||
| 54 | + }), | ||
| 55 | + // Compress extracted CSS. We are using this plugin so that possible | ||
| 56 | + // duplicated CSS from different components can be deduped. | ||
| 57 | + new OptimizeCSSPlugin({ | ||
| 58 | + cssProcessorOptions: config.build.productionSourceMap | ||
| 59 | + ? { safe: true, map: { inline: false } } | ||
| 60 | + : { safe: true } | ||
| 61 | + }), | ||
| 62 | + // generate dist index.html with correct asset hash for caching. | ||
| 63 | + // you can customize output by editing /index.html | ||
| 64 | + // see https://github.com/ampedandwired/html-webpack-plugin | ||
| 65 | + new HtmlWebpackPlugin({ | ||
| 66 | + filename: process.env.NODE_ENV === 'testing' | ||
| 67 | + ? 'index.html' | ||
| 68 | + : config.build.index, | ||
| 69 | + template: 'index.html', | ||
| 70 | + inject: true, | ||
| 71 | + minify: { | ||
| 72 | + removeComments: true, | ||
| 73 | + collapseWhitespace: true, | ||
| 74 | + removeAttributeQuotes: true | ||
| 75 | + // more options: | ||
| 76 | + // https://github.com/kangax/html-minifier#options-quick-reference | ||
| 77 | + }, | ||
| 78 | + // necessary to consistently work with multiple chunks via CommonsChunkPlugin | ||
| 79 | + chunksSortMode: 'dependency' | ||
| 80 | + }), | ||
| 81 | + // keep module.id stable when vendor modules does not change | ||
| 82 | + new webpack.HashedModuleIdsPlugin(), | ||
| 83 | + // enable scope hoisting | ||
| 84 | + new webpack.optimize.ModuleConcatenationPlugin(), | ||
| 85 | + // split vendor js into its own file | ||
| 86 | + new webpack.optimize.CommonsChunkPlugin({ | ||
| 87 | + name: 'vendor', | ||
| 88 | + minChunks (module) { | ||
| 89 | + // any required modules inside node_modules are extracted to vendor | ||
| 90 | + return ( | ||
| 91 | + module.resource && | ||
| 92 | + /\.js$/.test(module.resource) && | ||
| 93 | + module.resource.indexOf( | ||
| 94 | + path.join(__dirname, '../node_modules') | ||
| 95 | + ) === 0 | ||
| 96 | + ) | ||
| 97 | + } | ||
| 98 | + }), | ||
| 99 | + // extract webpack runtime and module manifest to its own file in order to | ||
| 100 | + // prevent vendor hash from being updated whenever app bundle is updated | ||
| 101 | + new webpack.optimize.CommonsChunkPlugin({ | ||
| 102 | + name: 'manifest', | ||
| 103 | + minChunks: Infinity | ||
| 104 | + }), | ||
| 105 | + // This instance extracts shared chunks from code splitted chunks and bundles them | ||
| 106 | + // in a separate chunk, similar to the vendor chunk | ||
| 107 | + // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk | ||
| 108 | + new webpack.optimize.CommonsChunkPlugin({ | ||
| 109 | + name: 'app', | ||
| 110 | + async: 'vendor-async', | ||
| 111 | + children: true, | ||
| 112 | + minChunks: 3 | ||
| 113 | + }), | ||
| 114 | + | ||
| 115 | + // copy custom static assets | ||
| 116 | + new CopyWebpackPlugin([ | ||
| 117 | + { | ||
| 118 | + from: path.resolve(__dirname, '../static'), | ||
| 119 | + to: config.build.assetsSubDirectory, | ||
| 120 | + ignore: ['.*'] | ||
| 121 | + } | ||
| 122 | + ]) | ||
| 123 | + ] | ||
| 124 | +}) | ||
| 125 | + | ||
| 126 | +if (config.build.productionGzip) { | ||
| 127 | + const CompressionWebpackPlugin = require('compression-webpack-plugin') | ||
| 128 | + | ||
| 129 | + webpackConfig.plugins.push( | ||
| 130 | + new CompressionWebpackPlugin({ | ||
| 131 | + asset: '[path].gz[query]', | ||
| 132 | + algorithm: 'gzip', | ||
| 133 | + test: new RegExp( | ||
| 134 | + '\\.(' + | ||
| 135 | + config.build.productionGzipExtensions.join('|') + | ||
| 136 | + ')$' | ||
| 137 | + ), | ||
| 138 | + threshold: 10240, | ||
| 139 | + minRatio: 0.8 | ||
| 140 | + }) | ||
| 141 | + ) | ||
| 142 | +} | ||
| 143 | + | ||
| 144 | +if (config.build.bundleAnalyzerReport) { | ||
| 145 | + const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin | ||
| 146 | + webpackConfig.plugins.push(new BundleAnalyzerPlugin()) | ||
| 147 | +} | ||
| 148 | + | ||
| 149 | +module.exports = webpackConfig |
config/dev.env.js
0 → 100644
config/index.js
0 → 100644
| 1 | +++ a/config/index.js | ||
| 1 | +'use strict' | ||
| 2 | +// Template version: 1.3.1 | ||
| 3 | +// see http://vuejs-templates.github.io/webpack for documentation. | ||
| 4 | + | ||
| 5 | +const path = require('path') | ||
| 6 | + | ||
| 7 | +module.exports = { | ||
| 8 | + dev: { | ||
| 9 | + // Paths | ||
| 10 | + assetsSubDirectory: 'static', | ||
| 11 | + assetsPublicPath: '/', | ||
| 12 | + proxyTable: { | ||
| 13 | + | ||
| 14 | + }, | ||
| 15 | + | ||
| 16 | + | ||
| 17 | + // Various Dev Server settings | ||
| 18 | + // host: 'localhost', // can be overwritten by process.env.HOST | ||
| 19 | + host: 'localhost', | ||
| 20 | + port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined | ||
| 21 | + autoOpenBrowser: false, | ||
| 22 | + errorOverlay: true, | ||
| 23 | + notifyOnErrors: true, | ||
| 24 | + poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- | ||
| 25 | + | ||
| 26 | + // Use Eslint Loader? | ||
| 27 | + // If true, your code will be linted during bundling and | ||
| 28 | + // linting errors and warnings will be shown in the console. | ||
| 29 | + useEslint: true, | ||
| 30 | + // If true, eslint errors and warnings will also be shown in the error overlay | ||
| 31 | + // in the browser. | ||
| 32 | + showEslintErrorsInOverlay: false, | ||
| 33 | + | ||
| 34 | + /** | ||
| 35 | + * Source Maps | ||
| 36 | + */ | ||
| 37 | + | ||
| 38 | + // https://webpack.js.org/configuration/devtool/#development | ||
| 39 | + devtool: 'cheap-module-eval-source-map', | ||
| 40 | + | ||
| 41 | + // If you have problems debugging vue-files in devtools, | ||
| 42 | + // set this to false - it *may* help | ||
| 43 | + // https://vue-loader.vuejs.org/en/options.html#cachebusting | ||
| 44 | + cacheBusting: true, | ||
| 45 | + | ||
| 46 | + cssSourceMap: true | ||
| 47 | + }, | ||
| 48 | + | ||
| 49 | + build: { | ||
| 50 | + // Template for index.html | ||
| 51 | + index: path.resolve(__dirname, '../dist/index.html'), | ||
| 52 | + | ||
| 53 | + // Paths | ||
| 54 | + assetsRoot: path.resolve(__dirname, '../dist'), | ||
| 55 | + assetsSubDirectory: 'static', | ||
| 56 | + assetsPublicPath: './', | ||
| 57 | + | ||
| 58 | + /** | ||
| 59 | + * Source Maps | ||
| 60 | + */ | ||
| 61 | + | ||
| 62 | + productionSourceMap: true, | ||
| 63 | + // https://webpack.js.org/configuration/devtool/#production | ||
| 64 | + devtool: '#source-map', | ||
| 65 | + | ||
| 66 | + // Gzip off by default as many popular static hosts such as | ||
| 67 | + // Surge or Netlify already gzip all static assets for you. | ||
| 68 | + // Before setting to `true`, make sure to: | ||
| 69 | + // npm install --save-dev compression-webpack-plugin | ||
| 70 | + productionGzip: false, | ||
| 71 | + productionGzipExtensions: ['js', 'css'], | ||
| 72 | + | ||
| 73 | + // Run the build command with an extra argument to | ||
| 74 | + // View the bundle analyzer report after build finishes: | ||
| 75 | + // `npm run build --report` | ||
| 76 | + // Set to `true` or `false` to always turn it on or off | ||
| 77 | + bundleAnalyzerReport: process.env.npm_config_report | ||
| 78 | + } | ||
| 79 | +} |
config/prod.env.js
0 → 100644
config/test.env.js
0 → 100644
index.html
0 → 100644
| 1 | +++ a/index.html | ||
| 1 | +<!DOCTYPE html> | ||
| 2 | +<html> | ||
| 3 | + <head> | ||
| 4 | + <meta charset="utf-8"> | ||
| 5 | + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,maximum-scale=1.0, user-scalable=no"> | ||
| 6 | + <title id="titleId"></title> | ||
| 7 | + </head> | ||
| 8 | + <style> | ||
| 9 | + body{height:100%;} | ||
| 10 | + </style> | ||
| 11 | + <body> | ||
| 12 | + <div id="app"></div> | ||
| 13 | + <!-- built files will be auto injected --> | ||
| 14 | + </body> | ||
| 15 | + <script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script> | ||
| 16 | + | ||
| 17 | +</html> |