mirror of
				https://github.com/simon987/simon987.net.git
				synced 2025-10-30 15:06:52 +00:00 
			
		
		
		
	Initial commit
This commit is contained in:
		
						commit
						0f631baeee
					
				
							
								
								
									
										14
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | .DS_Store | ||||||
|  | node_modules/ | ||||||
|  | /dist/ | ||||||
|  | npm-debug.log* | ||||||
|  | yarn-debug.log* | ||||||
|  | yarn-error.log* | ||||||
|  | 
 | ||||||
|  | # Editor directories and files | ||||||
|  | .idea | ||||||
|  | .vscode | ||||||
|  | *.suo | ||||||
|  | *.ntvs* | ||||||
|  | *.njsproj | ||||||
|  | *.sln | ||||||
							
								
								
									
										22
									
								
								simon987/.babelrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								simon987/.babelrc
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | { | ||||||
|  |     "presets": [ | ||||||
|  |         [ | ||||||
|  |             "env", | ||||||
|  |             { | ||||||
|  |                 "modules": false, | ||||||
|  |                 "targets": { | ||||||
|  |                     "browsers": [ | ||||||
|  |                         "> 1%", | ||||||
|  |                         "last 2 versions", | ||||||
|  |                         "not ie <= 8" | ||||||
|  |                     ] | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "stage-2" | ||||||
|  |     ], | ||||||
|  |     "plugins": [ | ||||||
|  |         "transform-vue-jsx", | ||||||
|  |         "transform-runtime" | ||||||
|  |     ] | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								simon987/.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								simon987/.editorconfig
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | root = true | ||||||
|  | 
 | ||||||
|  | [*] | ||||||
|  | charset = utf-8 | ||||||
|  | indent_style = space | ||||||
|  | indent_size = 4 | ||||||
|  | end_of_line = lf | ||||||
|  | insert_final_newline = true | ||||||
|  | trim_trailing_whitespace = true | ||||||
							
								
								
									
										10
									
								
								simon987/.postcssrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								simon987/.postcssrc.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | // https://github.com/michael-ciniawsky/postcss-load-config
 | ||||||
|  | 
 | ||||||
|  | module.exports = { | ||||||
|  |   "plugins": { | ||||||
|  |     "postcss-import": {}, | ||||||
|  |     "postcss-url": {}, | ||||||
|  |     // to edit target browsers: use "browserslist" field in package.json
 | ||||||
|  |     "autoprefixer": {} | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										41
									
								
								simon987/build/build.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								simon987/build/build.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | |||||||
|  | 'use strict' | ||||||
|  | require('./check-versions')() | ||||||
|  | 
 | ||||||
|  | process.env.NODE_ENV = 'production'; | ||||||
|  | 
 | ||||||
|  | const ora = require('ora'); | ||||||
|  | const rm = require('rimraf'); | ||||||
|  | const path = require('path'); | ||||||
|  | const chalk = require('chalk'); | ||||||
|  | const webpack = require('webpack'); | ||||||
|  | const config = require('../config'); | ||||||
|  | const webpackConfig = require('./webpack.prod.conf'); | ||||||
|  | 
 | ||||||
|  | const spinner = ora('building for production...'); | ||||||
|  | spinner.start(); | ||||||
|  | 
 | ||||||
|  | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { | ||||||
|  |     if (err) throw err; | ||||||
|  |     webpack(webpackConfig, (err, stats) => { | ||||||
|  |         spinner.stop(); | ||||||
|  |         if (err) throw err; | ||||||
|  |         process.stdout.write(stats.toString({ | ||||||
|  |             colors: true, | ||||||
|  |             modules: false, | ||||||
|  |             children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
 | ||||||
|  |             chunks: false, | ||||||
|  |             chunkModules: false | ||||||
|  |         }) + '\n\n'); | ||||||
|  | 
 | ||||||
|  |         if (stats.hasErrors()) { | ||||||
|  |             console.log(chalk.red('  Build failed with errors.\n')); | ||||||
|  |             process.exit(1) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         console.log(chalk.cyan('  Build complete.\n')); | ||||||
|  |         console.log(chalk.yellow( | ||||||
|  |             '  Tip: built files are meant to be served over an HTTP server.\n' + | ||||||
|  |             '  Opening index.html over file:// won\'t work.\n' | ||||||
|  |         )) | ||||||
|  |     }) | ||||||
|  | }); | ||||||
							
								
								
									
										54
									
								
								simon987/build/check-versions.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								simon987/build/check-versions.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | 'use strict'; | ||||||
|  | const chalk = require('chalk'); | ||||||
|  | const semver = require('semver'); | ||||||
|  | const packageConfig = require('../package.json'); | ||||||
|  | const shell = require('shelljs'); | ||||||
|  | 
 | ||||||
|  | function exec(cmd) { | ||||||
|  |     return require('child_process').execSync(cmd).toString().trim() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const versionRequirements = [ | ||||||
|  |     { | ||||||
|  |         name: 'node', | ||||||
|  |         currentVersion: semver.clean(process.version), | ||||||
|  |         versionRequirement: packageConfig.engines.node | ||||||
|  |     } | ||||||
|  | ]; | ||||||
|  | 
 | ||||||
|  | if (shell.which('npm')) { | ||||||
|  |     versionRequirements.push({ | ||||||
|  |         name: 'npm', | ||||||
|  |         currentVersion: exec('npm --version'), | ||||||
|  |         versionRequirement: packageConfig.engines.npm | ||||||
|  |     }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | module.exports = function () { | ||||||
|  |     const warnings = []; | ||||||
|  | 
 | ||||||
|  |     for (let i = 0; i < versionRequirements.length; i++) { | ||||||
|  |         const mod = versionRequirements[i]; | ||||||
|  | 
 | ||||||
|  |         if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { | ||||||
|  |             warnings.push(mod.name + ': ' + | ||||||
|  |                 chalk.red(mod.currentVersion) + ' should be ' + | ||||||
|  |                 chalk.green(mod.versionRequirement) | ||||||
|  |             ) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (warnings.length) { | ||||||
|  |         console.log(''); | ||||||
|  |         console.log(chalk.yellow('To use this template, you must update following to modules:')); | ||||||
|  |         console.log(); | ||||||
|  | 
 | ||||||
|  |         for (let i = 0; i < warnings.length; i++) { | ||||||
|  |             const warning = warnings[i]; | ||||||
|  |             console.log('  ' + warning) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         console.log(); | ||||||
|  |         process.exit(1) | ||||||
|  |     } | ||||||
|  | }; | ||||||
							
								
								
									
										
											BIN
										
									
								
								simon987/build/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								simon987/build/logo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 6.7 KiB | 
							
								
								
									
										101
									
								
								simon987/build/utils.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								simon987/build/utils.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,101 @@ | |||||||
|  | 'use strict'; | ||||||
|  | const path = require('path'); | ||||||
|  | const config = require('../config'); | ||||||
|  | const ExtractTextPlugin = require('extract-text-webpack-plugin'); | ||||||
|  | const packageConfig = require('../package.json'); | ||||||
|  | 
 | ||||||
|  | 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 (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' | ||||||
|  |             }) | ||||||
|  |         } 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') | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  | }; | ||||||
							
								
								
									
										22
									
								
								simon987/build/vue-loader.conf.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								simon987/build/vue-loader.conf.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | 'use strict'; | ||||||
|  | const utils = require('./utils'); | ||||||
|  | const config = require('../config'); | ||||||
|  | const isProduction = process.env.NODE_ENV === 'production'; | ||||||
|  | const sourceMapEnabled = isProduction | ||||||
|  |     ? config.build.productionSourceMap | ||||||
|  |     : config.dev.cssSourceMap; | ||||||
|  | 
 | ||||||
|  | module.exports = { | ||||||
|  |     loaders: utils.cssLoaders({ | ||||||
|  |         sourceMap: sourceMapEnabled, | ||||||
|  |         extract: isProduction | ||||||
|  |     }), | ||||||
|  |     cssSourceMap: sourceMapEnabled, | ||||||
|  |     cacheBusting: config.dev.cacheBusting, | ||||||
|  |     transformToRequire: { | ||||||
|  |         video: ['src', 'poster'], | ||||||
|  |         source: 'src', | ||||||
|  |         img: 'src', | ||||||
|  |         image: 'xlink:href' | ||||||
|  |     } | ||||||
|  | }; | ||||||
							
								
								
									
										80
									
								
								simon987/build/webpack.base.conf.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								simon987/build/webpack.base.conf.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | |||||||
|  | 'use strict'; | ||||||
|  | const path = require('path'); | ||||||
|  | const utils = require('./utils'); | ||||||
|  | const config = require('../config'); | ||||||
|  | const vueLoaderConfig = require('./vue-loader.conf'); | ||||||
|  | 
 | ||||||
|  | function resolve(dir) { | ||||||
|  |     return path.join(__dirname, '..', dir) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | module.exports = { | ||||||
|  |     context: path.resolve(__dirname, '../'), | ||||||
|  |     entry: { | ||||||
|  |         app: './src/main.js' | ||||||
|  |     }, | ||||||
|  |     output: { | ||||||
|  |         path: config.build.assetsRoot, | ||||||
|  |         filename: '[name].js', | ||||||
|  |         publicPath: process.env.NODE_ENV === 'production' | ||||||
|  |             ? config.build.assetsPublicPath | ||||||
|  |             : config.dev.assetsPublicPath | ||||||
|  |     }, | ||||||
|  |     resolve: { | ||||||
|  |         extensions: ['.js', '.vue', '.json'], | ||||||
|  |         alias: { | ||||||
|  |             '@': resolve('src'), | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     module: { | ||||||
|  |         rules: [ | ||||||
|  |             { | ||||||
|  |                 test: /\.vue$/, | ||||||
|  |                 loader: 'vue-loader', | ||||||
|  |                 options: vueLoaderConfig | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 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: 10000, | ||||||
|  |                     name: utils.assetsPath('img/[name].[hash:7].[ext]') | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, | ||||||
|  |                 loader: 'url-loader', | ||||||
|  |                 options: { | ||||||
|  |                     limit: 10000, | ||||||
|  |                     name: utils.assetsPath('media/[name].[hash:7].[ext]') | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, | ||||||
|  |                 loader: 'url-loader', | ||||||
|  |                 options: { | ||||||
|  |                     limit: 10000, | ||||||
|  |                     name: utils.assetsPath('fonts/[name].[hash:7].[ext]') | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     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' | ||||||
|  |     } | ||||||
|  | }; | ||||||
							
								
								
									
										95
									
								
								simon987/build/webpack.dev.conf.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										95
									
								
								simon987/build/webpack.dev.conf.js
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,95 @@ | |||||||
|  | 'use strict' | ||||||
|  | const utils = require('./utils') | ||||||
|  | const webpack = require('webpack') | ||||||
|  | const config = require('../config') | ||||||
|  | const merge = require('webpack-merge') | ||||||
|  | const path = require('path') | ||||||
|  | const baseWebpackConfig = require('./webpack.base.conf') | ||||||
|  | const CopyWebpackPlugin = require('copy-webpack-plugin') | ||||||
|  | const HtmlWebpackPlugin = require('html-webpack-plugin') | ||||||
|  | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') | ||||||
|  | const portfinder = require('portfinder') | ||||||
|  | 
 | ||||||
|  | const HOST = process.env.HOST | ||||||
|  | const PORT = process.env.PORT && Number(process.env.PORT) | ||||||
|  | 
 | ||||||
|  | const devWebpackConfig = merge(baseWebpackConfig, { | ||||||
|  |   module: { | ||||||
|  |     rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) | ||||||
|  |   }, | ||||||
|  |   // cheap-module-eval-source-map is faster for development
 | ||||||
|  |   devtool: config.dev.devtool, | ||||||
|  | 
 | ||||||
|  |   // these devServer options should be customized in /config/index.js
 | ||||||
|  |   devServer: { | ||||||
|  |     clientLogLevel: 'warning', | ||||||
|  |     historyApiFallback: { | ||||||
|  |       rewrites: [ | ||||||
|  |         { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, | ||||||
|  |       ], | ||||||
|  |     }, | ||||||
|  |     hot: true, | ||||||
|  |     contentBase: false, // since we use CopyWebpackPlugin.
 | ||||||
|  |     compress: true, | ||||||
|  |     host: HOST || config.dev.host, | ||||||
|  |     port: PORT || config.dev.port, | ||||||
|  |     open: config.dev.autoOpenBrowser, | ||||||
|  |     overlay: config.dev.errorOverlay | ||||||
|  |       ? { warnings: false, errors: true } | ||||||
|  |       : false, | ||||||
|  |     publicPath: config.dev.assetsPublicPath, | ||||||
|  |     proxy: config.dev.proxyTable, | ||||||
|  |     quiet: true, // necessary for FriendlyErrorsPlugin
 | ||||||
|  |     watchOptions: { | ||||||
|  |       poll: config.dev.poll, | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   plugins: [ | ||||||
|  |     new webpack.DefinePlugin({ | ||||||
|  |       'process.env': require('../config/dev.env') | ||||||
|  |     }), | ||||||
|  |     new webpack.HotModuleReplacementPlugin(), | ||||||
|  |     new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
 | ||||||
|  |     new webpack.NoEmitOnErrorsPlugin(), | ||||||
|  |     // https://github.com/ampedandwired/html-webpack-plugin
 | ||||||
|  |     new HtmlWebpackPlugin({ | ||||||
|  |       filename: 'index.html', | ||||||
|  |       template: 'index.html', | ||||||
|  |       inject: true | ||||||
|  |     }), | ||||||
|  |     // copy custom static assets
 | ||||||
|  |     new CopyWebpackPlugin([ | ||||||
|  |       { | ||||||
|  |         from: path.resolve(__dirname, '../static'), | ||||||
|  |         to: config.dev.assetsSubDirectory, | ||||||
|  |         ignore: ['.*'] | ||||||
|  |       } | ||||||
|  |     ]) | ||||||
|  |   ] | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | module.exports = new Promise((resolve, reject) => { | ||||||
|  |   portfinder.basePort = process.env.PORT || config.dev.port | ||||||
|  |   portfinder.getPort((err, port) => { | ||||||
|  |     if (err) { | ||||||
|  |       reject(err) | ||||||
|  |     } else { | ||||||
|  |       // publish the new Port, necessary for e2e tests
 | ||||||
|  |       process.env.PORT = port | ||||||
|  |       // add port to devServer config
 | ||||||
|  |       devWebpackConfig.devServer.port = port | ||||||
|  | 
 | ||||||
|  |       // Add FriendlyErrorsPlugin
 | ||||||
|  |       devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ | ||||||
|  |         compilationSuccessInfo: { | ||||||
|  |           messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], | ||||||
|  |         }, | ||||||
|  |         onErrors: config.dev.notifyOnErrors | ||||||
|  |         ? utils.createNotifierCallback() | ||||||
|  |         : undefined | ||||||
|  |       })) | ||||||
|  | 
 | ||||||
|  |       resolve(devWebpackConfig) | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | }) | ||||||
							
								
								
									
										155
									
								
								simon987/build/webpack.prod.conf.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								simon987/build/webpack.prod.conf.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,155 @@ | |||||||
|  | 'use strict'; | ||||||
|  | const path = require('path'); | ||||||
|  | const utils = require('./utils'); | ||||||
|  | const webpack = require('webpack'); | ||||||
|  | const config = require('../config'); | ||||||
|  | const merge = require('webpack-merge'); | ||||||
|  | const baseWebpackConfig = require('./webpack.base.conf'); | ||||||
|  | const CopyWebpackPlugin = require('copy-webpack-plugin'); | ||||||
|  | const HtmlWebpackPlugin = require('html-webpack-plugin'); | ||||||
|  | const ExtractTextPlugin = require('extract-text-webpack-plugin'); | ||||||
|  | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin'); | ||||||
|  | const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); | ||||||
|  | 
 | ||||||
|  | const env = require('../config/prod.env'); | ||||||
|  | 
 | ||||||
|  | const webpackConfig = merge(baseWebpackConfig, { | ||||||
|  |     module: { | ||||||
|  |         rules: utils.styleLoaders({ | ||||||
|  |             sourceMap: config.build.productionSourceMap, | ||||||
|  |             extract: true, | ||||||
|  |             usePostCSS: true | ||||||
|  |         }) | ||||||
|  |     }, | ||||||
|  |     devtool: config.build.productionSourceMap ? config.build.devtool : false, | ||||||
|  |     output: { | ||||||
|  |         path: config.build.assetsRoot, | ||||||
|  |         filename: utils.assetsPath('js/[name].[chunkhash].js'), | ||||||
|  |         chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') | ||||||
|  |     }, | ||||||
|  |     plugins: [ | ||||||
|  |         // http://vuejs.github.io/vue-loader/en/workflow/production.html
 | ||||||
|  |         new webpack.DefinePlugin({ | ||||||
|  |             'process.env': env | ||||||
|  |         }), | ||||||
|  |         new UglifyJsPlugin({ | ||||||
|  |             uglifyOptions: { | ||||||
|  |                 comments: false, | ||||||
|  |                 compress: { | ||||||
|  |                     unused: true, | ||||||
|  |                     dead_code: true, | ||||||
|  |                     drop_debugger: true, | ||||||
|  |                     conditionals: true, | ||||||
|  |                     evaluate: true, | ||||||
|  |                     drop_console: true, | ||||||
|  |                     sequences: true, | ||||||
|  |                     booleans: true, | ||||||
|  |                     warnings: false | ||||||
|  |                 }, | ||||||
|  |                 output: {comments: false} | ||||||
|  |             }, | ||||||
|  |             sourceMap: config.build.productionSourceMap, | ||||||
|  |             parallel: true | ||||||
|  |         }), | ||||||
|  |         // extract css into its own file
 | ||||||
|  |         new ExtractTextPlugin({ | ||||||
|  |             filename: utils.assetsPath('css/[name].[contenthash].css'), | ||||||
|  |             // Setting the following option to `false` will not extract CSS from codesplit chunks.
 | ||||||
|  |             // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
 | ||||||
|  |             // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
 | ||||||
|  |             // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
 | ||||||
|  |             allChunks: true, | ||||||
|  |         }), | ||||||
|  |         // Compress extracted CSS. We are using this plugin so that possible
 | ||||||
|  |         // duplicated CSS from different components can be deduped.
 | ||||||
|  |         new OptimizeCSSPlugin({ | ||||||
|  |             cssProcessorOptions: config.build.productionSourceMap | ||||||
|  |                 ? {safe: true, map: {inline: false}} | ||||||
|  |                 : {safe: true} | ||||||
|  |         }), | ||||||
|  |         // generate dist index.html with correct asset hash for caching.
 | ||||||
|  |         // you can customize output by editing /index.html
 | ||||||
|  |         // see https://github.com/ampedandwired/html-webpack-plugin
 | ||||||
|  |         new HtmlWebpackPlugin({ | ||||||
|  |             filename: config.build.index, | ||||||
|  |             template: 'index.html', | ||||||
|  |             inject: true, | ||||||
|  |             minify: { | ||||||
|  |                 removeComments: true, | ||||||
|  |                 collapseWhitespace: true, | ||||||
|  |                 removeAttributeQuotes: true | ||||||
|  |                 // more options:
 | ||||||
|  |                 // https://github.com/kangax/html-minifier#options-quick-reference
 | ||||||
|  |             }, | ||||||
|  |             // necessary to consistently work with multiple chunks via CommonsChunkPlugin
 | ||||||
|  |             chunksSortMode: 'dependency' | ||||||
|  |         }), | ||||||
|  |         // keep module.id stable when vendor modules does not change
 | ||||||
|  |         new webpack.HashedModuleIdsPlugin(), | ||||||
|  |         // enable scope hoisting
 | ||||||
|  |         new webpack.optimize.ModuleConcatenationPlugin(), | ||||||
|  |         // split vendor js into its own file
 | ||||||
|  |         new webpack.optimize.CommonsChunkPlugin({ | ||||||
|  |             name: 'vendor', | ||||||
|  |             minChunks(module) { | ||||||
|  |                 // any required modules inside node_modules are extracted to vendor
 | ||||||
|  |                 return ( | ||||||
|  |                     module.resource && | ||||||
|  |                     /\.js$/.test(module.resource) && | ||||||
|  |                     module.resource.indexOf( | ||||||
|  |                         path.join(__dirname, '../node_modules') | ||||||
|  |                     ) === 0 | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|  |         }), | ||||||
|  |         // extract webpack runtime and module manifest to its own file in order to
 | ||||||
|  |         // prevent vendor hash from being updated whenever app bundle is updated
 | ||||||
|  |         new webpack.optimize.CommonsChunkPlugin({ | ||||||
|  |             name: 'manifest', | ||||||
|  |             minChunks: Infinity | ||||||
|  |         }), | ||||||
|  |         // This instance extracts shared chunks from code splitted chunks and bundles them
 | ||||||
|  |         // in a separate chunk, similar to the vendor chunk
 | ||||||
|  |         // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
 | ||||||
|  |         new webpack.optimize.CommonsChunkPlugin({ | ||||||
|  |             name: 'app', | ||||||
|  |             async: 'vendor-async', | ||||||
|  |             children: true, | ||||||
|  |             minChunks: 3 | ||||||
|  |         }), | ||||||
|  | 
 | ||||||
|  |         // copy custom static assets
 | ||||||
|  |         new CopyWebpackPlugin([ | ||||||
|  |             { | ||||||
|  |                 from: path.resolve(__dirname, '../static'), | ||||||
|  |                 to: config.build.assetsSubDirectory, | ||||||
|  |                 ignore: ['.*'] | ||||||
|  |             } | ||||||
|  |         ]) | ||||||
|  |     ] | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | if (config.build.productionGzip) { | ||||||
|  |     const CompressionWebpackPlugin = require('compression-webpack-plugin'); | ||||||
|  | 
 | ||||||
|  |     webpackConfig.plugins.push( | ||||||
|  |         new CompressionWebpackPlugin({ | ||||||
|  |             asset: '[path].gz[query]', | ||||||
|  |             algorithm: 'gzip', | ||||||
|  |             test: new RegExp( | ||||||
|  |                 '\\.(' + | ||||||
|  |                 config.build.productionGzipExtensions.join('|') + | ||||||
|  |                 ')$' | ||||||
|  |             ), | ||||||
|  |             threshold: 10240, | ||||||
|  |             minRatio: 0.8 | ||||||
|  |         }) | ||||||
|  |     ) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if (config.build.bundleAnalyzerReport) { | ||||||
|  |     const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; | ||||||
|  |     webpackConfig.plugins.push(new BundleAnalyzerPlugin()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | module.exports = webpackConfig; | ||||||
							
								
								
									
										7
									
								
								simon987/config/dev.env.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								simon987/config/dev.env.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | 'use strict'; | ||||||
|  | const merge = require('webpack-merge'); | ||||||
|  | const prodEnv = require('./prod.env'); | ||||||
|  | 
 | ||||||
|  | module.exports = merge(prodEnv, { | ||||||
|  |     NODE_ENV: '"development"' | ||||||
|  | }); | ||||||
							
								
								
									
										69
									
								
								simon987/config/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								simon987/config/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | |||||||
|  | 'use strict'; | ||||||
|  | // Template version: 1.3.1
 | ||||||
|  | // see http://vuejs-templates.github.io/webpack for documentation.
 | ||||||
|  | 
 | ||||||
|  | const path = require('path'); | ||||||
|  | 
 | ||||||
|  | module.exports = { | ||||||
|  |     dev: { | ||||||
|  | 
 | ||||||
|  |         // Paths
 | ||||||
|  |         assetsSubDirectory: 'static', | ||||||
|  |         assetsPublicPath: '/', | ||||||
|  |         proxyTable: {}, | ||||||
|  | 
 | ||||||
|  |         // Various Dev Server settings
 | ||||||
|  |         host: '0.0.0.0', // can be overwritten by process.env.HOST
 | ||||||
|  |         port: 42901, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
 | ||||||
|  |         autoOpenBrowser: false, | ||||||
|  |         errorOverlay: true, | ||||||
|  |         notifyOnErrors: true, | ||||||
|  |         poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         /** | ||||||
|  |          * Source Maps | ||||||
|  |          */ | ||||||
|  | 
 | ||||||
|  |         // https://webpack.js.org/configuration/devtool/#development
 | ||||||
|  |         devtool: 'cheap-module-eval-source-map', | ||||||
|  | 
 | ||||||
|  |         // If you have problems debugging vue-files in devtools,
 | ||||||
|  |         // set this to false - it *may* help
 | ||||||
|  |         // https://vue-loader.vuejs.org/en/options.html#cachebusting
 | ||||||
|  |         cacheBusting: true, | ||||||
|  | 
 | ||||||
|  |         cssSourceMap: true | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     build: { | ||||||
|  |         // Template for index.html
 | ||||||
|  |         index: path.resolve(__dirname, '../dist/index.html'), | ||||||
|  | 
 | ||||||
|  |         // Paths
 | ||||||
|  |         assetsRoot: path.resolve(__dirname, '../dist'), | ||||||
|  |         assetsSubDirectory: 'static', | ||||||
|  |         assetsPublicPath: '/', | ||||||
|  | 
 | ||||||
|  |         /** | ||||||
|  |          * Source Maps | ||||||
|  |          */ | ||||||
|  | 
 | ||||||
|  |         productionSourceMap: true, | ||||||
|  |         // https://webpack.js.org/configuration/devtool/#production
 | ||||||
|  |         devtool: '#source-map', | ||||||
|  | 
 | ||||||
|  |         // Gzip off by default as many popular static hosts such as
 | ||||||
|  |         // Surge or Netlify already gzip all static assets for you.
 | ||||||
|  |         // Before setting to `true`, make sure to:
 | ||||||
|  |         // npm install --save-dev compression-webpack-plugin
 | ||||||
|  |         productionGzip: false, | ||||||
|  |         productionGzipExtensions: ['js', 'css'], | ||||||
|  | 
 | ||||||
|  |         // Run the build command with an extra argument to
 | ||||||
|  |         // View the bundle analyzer report after build finishes:
 | ||||||
|  |         // `npm run build --report`
 | ||||||
|  |         // Set to `true` or `false` to always turn it on or off
 | ||||||
|  |         bundleAnalyzerReport: process.env.npm_config_report | ||||||
|  |     } | ||||||
|  | }; | ||||||
							
								
								
									
										4
									
								
								simon987/config/prod.env.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								simon987/config/prod.env.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | 'use strict'; | ||||||
|  | module.exports = { | ||||||
|  |     NODE_ENV: '"production"' | ||||||
|  | }; | ||||||
							
								
								
									
										11
									
								
								simon987/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								simon987/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <meta name="viewport" content="width=device-width,initial-scale=1.0"> | ||||||
|  |     <title>wip</title> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | <div id="app"></div> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										10862
									
								
								simon987/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										10862
									
								
								simon987/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										65
									
								
								simon987/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								simon987/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,65 @@ | |||||||
|  | { | ||||||
|  |   "name": "simon987.net", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "description": "A Vue.js project", | ||||||
|  |   "author": "simon987 <fortier.simon@protonmail.com>", | ||||||
|  |   "private": true, | ||||||
|  |   "scripts": { | ||||||
|  |     "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", | ||||||
|  |     "start": "npm run dev", | ||||||
|  |     "build": "node build/build.js" | ||||||
|  |   }, | ||||||
|  |   "dependencies": { | ||||||
|  |     "d3": "^5.9.2", | ||||||
|  |     "lodash": "^4.17.11", | ||||||
|  |     "pixi.js": "^4.8.7", | ||||||
|  |     "vue": "^2.5.2", | ||||||
|  |     "vue-router": "^3.0.1" | ||||||
|  |   }, | ||||||
|  |   "devDependencies": { | ||||||
|  |     "autoprefixer": "^7.1.2", | ||||||
|  |     "babel-core": "^6.22.1", | ||||||
|  |     "babel-helper-vue-jsx-merge-props": "^2.0.3", | ||||||
|  |     "babel-loader": "^7.1.1", | ||||||
|  |     "babel-plugin-syntax-jsx": "^6.18.0", | ||||||
|  |     "babel-plugin-transform-runtime": "^6.22.0", | ||||||
|  |     "babel-plugin-transform-vue-jsx": "^3.5.0", | ||||||
|  |     "babel-preset-env": "^1.3.2", | ||||||
|  |     "babel-preset-stage-2": "^6.22.0", | ||||||
|  |     "chalk": "^2.0.1", | ||||||
|  |     "copy-webpack-plugin": "^4.0.1", | ||||||
|  |     "css-loader": "^0.28.0", | ||||||
|  |     "extract-text-webpack-plugin": "^3.0.0", | ||||||
|  |     "file-loader": "^1.1.4", | ||||||
|  |     "friendly-errors-webpack-plugin": "^1.6.1", | ||||||
|  |     "html-webpack-plugin": "^2.30.1", | ||||||
|  |     "node-notifier": "^5.1.2", | ||||||
|  |     "optimize-css-assets-webpack-plugin": "^3.2.0", | ||||||
|  |     "ora": "^1.2.0", | ||||||
|  |     "portfinder": "^1.0.13", | ||||||
|  |     "postcss-import": "^11.0.0", | ||||||
|  |     "postcss-loader": "^2.0.8", | ||||||
|  |     "postcss-url": "^7.2.1", | ||||||
|  |     "rimraf": "^2.6.0", | ||||||
|  |     "semver": "^5.3.0", | ||||||
|  |     "shelljs": "^0.7.6", | ||||||
|  |     "uglifyjs-webpack-plugin": "^1.1.1", | ||||||
|  |     "url-loader": "^0.5.8", | ||||||
|  |     "vue-loader": "^13.3.0", | ||||||
|  |     "vue-style-loader": "^3.0.1", | ||||||
|  |     "vue-template-compiler": "^2.5.2", | ||||||
|  |     "webpack": "^3.6.0", | ||||||
|  |     "webpack-bundle-analyzer": "^2.9.0", | ||||||
|  |     "webpack-dev-server": "^2.9.1", | ||||||
|  |     "webpack-merge": "^4.1.0" | ||||||
|  |   }, | ||||||
|  |   "engines": { | ||||||
|  |     "node": ">= 6.0.0", | ||||||
|  |     "npm": ">= 3.0.0" | ||||||
|  |   }, | ||||||
|  |   "browserslist": [ | ||||||
|  |     "> 1%", | ||||||
|  |     "last 2 versions", | ||||||
|  |     "not ie <= 8" | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								simon987/src/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								simon987/src/App.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | <template> | ||||||
|  |   <div id="app"> | ||||||
|  |     <router-view/> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  |   name: 'App' | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  |     body { | ||||||
|  |         margin: 0; | ||||||
|  |         padding: 0; | ||||||
|  |     } | ||||||
|  |     html { | ||||||
|  |         overflow-x: hidden; | ||||||
|  |         margin: 0; | ||||||
|  |         padding: 0; | ||||||
|  |     } | ||||||
|  | </style> | ||||||
							
								
								
									
										264
									
								
								simon987/src/Grid.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								simon987/src/Grid.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,264 @@ | |||||||
|  | // import * as d3 from 'd3';
 | ||||||
|  | import * as PIXI from 'pixi.js' | ||||||
|  | import * as _ from 'lodash' | ||||||
|  | 
 | ||||||
|  | function Grid(cellSize, tickLen) { | ||||||
|  | 
 | ||||||
|  |     // Light
 | ||||||
|  |     this.c1 = 0xf9989f; | ||||||
|  |     this.c2 = 0xfccb8f; | ||||||
|  |     this.c3 = 0xc5f8c8; | ||||||
|  |     // this.c1 = 0x3a3b52;
 | ||||||
|  |     // this.c2 = 0x33284b;
 | ||||||
|  |     // this.c3 = 0x2c2332;
 | ||||||
|  | 
 | ||||||
|  |     this.seed = function () { | ||||||
|  |         this._cells = new Uint8Array(this._cellCount).map(() => { | ||||||
|  |             let x = Math.random(); | ||||||
|  |             if (x < 1 / 3) { | ||||||
|  |                 return 2; | ||||||
|  |             } else if (x < 2 / 3) { | ||||||
|  |                 return 4; | ||||||
|  |             } | ||||||
|  |             return 8; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     this.resize = function () { | ||||||
|  |         this._pxWidth = window.innerWidth; | ||||||
|  |         this._pxHeight = window.innerHeight; | ||||||
|  | 
 | ||||||
|  |         if (this.app) { | ||||||
|  |             this.app.renderer.view.style.width = this._pxWidth + "px"; | ||||||
|  |             this.app.renderer.view.style.height = this._pxHeight + "px"; | ||||||
|  |             this.app.renderer.resize(window.innerWidth, window.innerHeight); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         this._cellCountX = Math.ceil(this._pxWidth / cellSize); | ||||||
|  |         this._cellCountY = Math.ceil(this._pxHeight / cellSize); | ||||||
|  |         this._cellCount = this._cellCountX * this._cellCountY; | ||||||
|  | 
 | ||||||
|  |         this.seed(); | ||||||
|  | 
 | ||||||
|  |         this.xMap = _.range(0, this._cellCount).map(x => x % this._cellCountX); | ||||||
|  |         this.xCoordsMap = this.xMap.map(x => x * cellSize); | ||||||
|  |         this.yCoordsMap = _.range(0, this._cellCount) | ||||||
|  |             .map(y => Math.floor(y / this._cellCountX)) | ||||||
|  |             .map(y => y * cellSize); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     this.g_TICK = tickLen; | ||||||
|  |     this.g_Time = 0; | ||||||
|  | 
 | ||||||
|  |     this._cellSize = cellSize; | ||||||
|  | 
 | ||||||
|  |     this.setup = function () { | ||||||
|  | 
 | ||||||
|  |         let elem = document.getElementById("grid"); | ||||||
|  | 
 | ||||||
|  |         this.app = new PIXI.Application({ | ||||||
|  |             width: 0, | ||||||
|  |             height: 0, | ||||||
|  |             backgroundColor: 0xFFFFFF, | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         elem.appendChild(this.app.view); | ||||||
|  | 
 | ||||||
|  |         this._graphics = new PIXI.Graphics(); | ||||||
|  |         this.app.stage.addChild(this._graphics); | ||||||
|  | 
 | ||||||
|  |         this.app.ticker.add(() => { | ||||||
|  | 
 | ||||||
|  |             // Limit to the frame rate
 | ||||||
|  |             let timeNow = (new Date()).getTime(); | ||||||
|  |             let timeDiff = timeNow - this.g_Time; | ||||||
|  |             if (timeDiff < this.g_TICK) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             this.g_Time = timeNow; | ||||||
|  | 
 | ||||||
|  |             this.tick(); | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         window.onresize = () => this.resize(); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     this.paint = function () { | ||||||
|  | 
 | ||||||
|  |         this._graphics.clear(); | ||||||
|  | 
 | ||||||
|  |         let bgColor = this.getColor(0); | ||||||
|  | 
 | ||||||
|  |         this._graphics.beginFill(bgColor) | ||||||
|  |             .drawRect(0, 0, this._pxWidth, this._pxHeight) | ||||||
|  |             .endFill(); | ||||||
|  | 
 | ||||||
|  |         let cells = _.groupBy(_.range(0, this._cellCount), this.getColor); | ||||||
|  |         for (let color in cells) { | ||||||
|  | 
 | ||||||
|  |             let intCol = Number(color); | ||||||
|  | 
 | ||||||
|  |             if (intCol !== bgColor) { | ||||||
|  |                 this._graphics.beginFill(intCol); | ||||||
|  | 
 | ||||||
|  |                 cells[color].forEach(d => this._graphics | ||||||
|  |                     .drawRect( | ||||||
|  |                         this.xCoordsMap[d], | ||||||
|  |                         this.yCoordsMap[d], | ||||||
|  |                         this._cellSize, | ||||||
|  |                         this._cellSize | ||||||
|  |                     ) | ||||||
|  |                 ); | ||||||
|  |                 this._graphics.endFill() | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     this.tick = function () { | ||||||
|  | 
 | ||||||
|  |         let xw = this._cellCountX; | ||||||
|  |         let neighbors = new Uint8Array(8); | ||||||
|  |         let cells = this._cells; | ||||||
|  |         let newCells = new Uint8Array(this._cellCount); | ||||||
|  |         let lastCell = this._cellCount - 1; | ||||||
|  |         let xw_m1 = xw - 1; | ||||||
|  |         let xw_p1 = xw + 1; | ||||||
|  |         let lastRowIndex = this._cellCount - xw; | ||||||
|  | 
 | ||||||
|  |         for (let i = 0; i < this._cellCount; i++) { | ||||||
|  | 
 | ||||||
|  |             let x = this.xMap[i]; | ||||||
|  | 
 | ||||||
|  |             if (i < xw) { | ||||||
|  |                 if (i === 0) { | ||||||
|  |                     neighbors[0] = cells[lastCell]; | ||||||
|  |                     neighbors[1] = cells[lastCell - xw_p1]; | ||||||
|  |                     neighbors[2] = cells[lastRowIndex]; | ||||||
|  |                     neighbors[3] = cells[xw_m1]; | ||||||
|  |                     neighbors[4] = cells[1]; | ||||||
|  |                     neighbors[5] = cells[xw + xw_m1]; | ||||||
|  |                     neighbors[6] = cells[xw]; | ||||||
|  |                     neighbors[7] = cells[xw_p1]; | ||||||
|  |                 } else { | ||||||
|  |                     neighbors[0] = cells[lastCell - (xw - i)]; | ||||||
|  |                     neighbors[1] = cells[lastRowIndex + i]; | ||||||
|  |                     if (i === xw_m1) { | ||||||
|  |                         neighbors[2] = cells[lastRowIndex]; | ||||||
|  |                     } else { | ||||||
|  |                         neighbors[2] = cells[lastRowIndex + i + 1]; | ||||||
|  |                     } | ||||||
|  |                     neighbors[3] = cells[i - 1]; | ||||||
|  |                     neighbors[4] = cells[i + 1]; | ||||||
|  |                     neighbors[5] = cells[i + xw_m1]; | ||||||
|  |                     neighbors[6] = cells[i + xw]; | ||||||
|  |                     neighbors[7] = cells[i + xw_p1]; | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 if (x === 0) { | ||||||
|  |                     neighbors[0] = cells[i - 1]; | ||||||
|  |                     neighbors[3] = cells[i + xw_m1]; | ||||||
|  |                 } else { | ||||||
|  |                     neighbors[0] = cells[i - xw_p1]; | ||||||
|  |                     neighbors[3] = cells[i - 1]; | ||||||
|  |                 } | ||||||
|  |                 neighbors[1] = cells[i - xw]; | ||||||
|  |                 if (x === xw_m1) { | ||||||
|  |                     neighbors[2] = cells[i - xw - xw_p1]; | ||||||
|  |                     neighbors[4] = cells[i - xw_m1]; | ||||||
|  |                 } else { | ||||||
|  |                     neighbors[2] = cells[i - xw_m1]; | ||||||
|  |                     neighbors[4] = cells[i + 1]; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 if (i < lastRowIndex) { | ||||||
|  |                     if (x === 0) { | ||||||
|  |                         neighbors[5] = cells[i + xw + xw_m1]; | ||||||
|  |                         neighbors[7] = cells[i + xw_p1]; | ||||||
|  |                     } else { | ||||||
|  |                         neighbors[5] = cells[i + xw_m1]; | ||||||
|  |                         if (x === xw_m1) { | ||||||
|  |                             neighbors[7] = cells[i + 1]; | ||||||
|  |                         } else { | ||||||
|  |                             neighbors[7] = cells[i + xw_p1]; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     neighbors[6] = cells[i + xw]; | ||||||
|  |                 } else if (i > lastRowIndex) { | ||||||
|  |                     neighbors[5] = cells[x - 1]; | ||||||
|  |                     neighbors[6] = cells[x]; | ||||||
|  |                     if (i === lastCell) { | ||||||
|  |                         neighbors[7] = cells[0]; | ||||||
|  |                     } else { | ||||||
|  |                         neighbors[7] = cells[x + 1]; | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     neighbors[5] = cells[xw_m1]; | ||||||
|  |                     neighbors[6] = cells[0]; | ||||||
|  |                     neighbors[7] = cells[1]; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             newCells[i] = this.computeState(cells[i], neighbors) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         this._cells = newCells; | ||||||
|  |         this.paint(); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     this.getColor = (cell) => { | ||||||
|  |         if (this._cells[cell] === 2) { | ||||||
|  |             return this.c1; | ||||||
|  |         } else if (this._cells[cell] === 4) { | ||||||
|  |             return this.c2; | ||||||
|  |         } | ||||||
|  |         return this.c3; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     // this.computeState_ = (state, neighbors) => {
 | ||||||
|  |     //
 | ||||||
|  |     //     let liveNeighbors = 0;
 | ||||||
|  |     //     for (let i = 0; i < 8; i++) {
 | ||||||
|  |     //         if (neighbors[i] === 1) {
 | ||||||
|  |     //             liveNeighbors++;
 | ||||||
|  |     //         }
 | ||||||
|  |     //     }
 | ||||||
|  |     //
 | ||||||
|  |     //     if (state === 1) {
 | ||||||
|  |     //         if (liveNeighbors < 2 || liveNeighbors > 3) {
 | ||||||
|  |     //             return 0;
 | ||||||
|  |     //         }
 | ||||||
|  |     //     } else if (liveNeighbors === 3) {
 | ||||||
|  |     //         return 1;
 | ||||||
|  |     //     }
 | ||||||
|  |     //     return state;
 | ||||||
|  |     // };
 | ||||||
|  | 
 | ||||||
|  |     this.computeState = (state, neighbors) => { | ||||||
|  | 
 | ||||||
|  |         let predators = 0; | ||||||
|  |         let predator; | ||||||
|  | 
 | ||||||
|  |         if (state === 2) { | ||||||
|  |             predator = 4; | ||||||
|  |         } else if (state === 4) { | ||||||
|  |             predator = 8; | ||||||
|  |         } else { | ||||||
|  |             predator = 2; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         for (let i = 0; i < 8; i++) { | ||||||
|  |             if (neighbors[i] === predator) { | ||||||
|  |                 predators++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (predators >= 3) { | ||||||
|  |             return predator; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return state; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | export default Grid; | ||||||
							
								
								
									
										
											BIN
										
									
								
								simon987/src/assets/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								simon987/src/assets/logo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 6.7 KiB | 
							
								
								
									
										34
									
								
								simon987/src/components/HelloWorld.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								simon987/src/components/HelloWorld.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | <template> | ||||||
|  |   <div id="grid"> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | import Grid from '../Grid'; | ||||||
|  | 
 | ||||||
|  | window.onload = () => { | ||||||
|  | 
 | ||||||
|  |     let grid = new Grid( | ||||||
|  |         window.innerWidth < 1000 ? 20 : 30, | ||||||
|  |         window.innerWidth < 1000 ? 80 : 40, | ||||||
|  |     ); | ||||||
|  |     grid.setup(); | ||||||
|  |     grid.resize(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |   name: 'HelloWorld', | ||||||
|  |   data () { | ||||||
|  |     return { | ||||||
|  |       msg: 'Welcome to Your Vue.js App' | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped> | ||||||
|  |     #grid { | ||||||
|  |         position: fixed; | ||||||
|  |         background: white; | ||||||
|  |     } | ||||||
|  | </style> | ||||||
							
								
								
									
										12
									
								
								simon987/src/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								simon987/src/main.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | import Vue from 'vue' | ||||||
|  | import App from './App' | ||||||
|  | import router from './router' | ||||||
|  | 
 | ||||||
|  | Vue.config.productionTip = false | ||||||
|  | 
 | ||||||
|  | /* eslint-disable no-new */ | ||||||
|  | new Vue({ | ||||||
|  |   el: '#app', | ||||||
|  |   router, | ||||||
|  |   render: h => h(App) | ||||||
|  | }) | ||||||
							
								
								
									
										15
									
								
								simon987/src/router/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								simon987/src/router/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | import Vue from 'vue' | ||||||
|  | import Router from 'vue-router' | ||||||
|  | import HelloWorld from '@/components/HelloWorld' | ||||||
|  | 
 | ||||||
|  | Vue.use(Router); | ||||||
|  | 
 | ||||||
|  | export default new Router({ | ||||||
|  |     routes: [ | ||||||
|  |         { | ||||||
|  |             path: '/', | ||||||
|  |             name: 'HelloWorld', | ||||||
|  |             component: HelloWorld | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  | }) | ||||||
							
								
								
									
										0
									
								
								simon987/static/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								simon987/static/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user