From 9ea8e8e3146323a58ed8522ec7d5ee0fbbe798ef Mon Sep 17 00:00:00 2001 From: INOUE Takuya Date: Mon, 26 Dec 2016 00:04:35 +0900 Subject: [PATCH 001/118] Move html-webpack-plugin to devDependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4c754c1c3..3a486505d 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "es6-promise": "^4.0.5", "express": "^4.14.0", "firebase": "^3.6.2", - "html-webpack-plugin": "^2.24.1", "lru-cache": "^4.0.2", "serialize-javascript": "^1.3.0", "serve-favicon": "^2.3.2", @@ -37,6 +36,7 @@ "css-loader": "^0.26.0", "extract-text-webpack-plugin": "^2.0.0-beta.3", "file-loader": "^0.9.0", + "html-webpack-plugin": "^2.24.1", "rimraf": "^2.5.4", "stylus": "^0.54.5", "stylus-loader": "^2.4.0", From a2fbe5f2b0d22c1b4f36878b5db285e6dc209b27 Mon Sep 17 00:00:00 2001 From: Iegor Azuaga Date: Thu, 29 Dec 2016 16:33:55 +0100 Subject: [PATCH 002/118] Move `cross-env` dep out of devDependencies (#105) Since the module is used to bootstrap a production version of the site (see the npm `start` script), it shouldn't be inside devDependencies. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a486505d..bf6f215ec 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "compression": "^1.6.2", + "cross-env": "^3.1.3", "es6-promise": "^4.0.5", "express": "^4.14.0", "firebase": "^3.6.2", @@ -32,7 +33,6 @@ "autoprefixer": "^6.5.3", "buble": "^0.15.1", "buble-loader": "^0.4.0", - "cross-env": "^3.1.3", "css-loader": "^0.26.0", "extract-text-webpack-plugin": "^2.0.0-beta.3", "file-loader": "^0.9.0", From 7772994c6117da0388817a83f556c15ef70b8b50 Mon Sep 17 00:00:00 2001 From: Stef van den Ham Date: Thu, 29 Dec 2016 16:35:05 +0100 Subject: [PATCH 003/118] Fix path to favicon (#106) logo.png 404's at the moment --- src/index.template.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.template.html b/src/index.template.html index 46be3e354..3a8f02512 100644 --- a/src/index.template.html +++ b/src/index.template.html @@ -5,7 +5,7 @@ Vue HN 2.0 - + From e47e5c61dce753a6189c6104bc48f94fcf4b9f6e Mon Sep 17 00:00:00 2001 From: Matthew Pietz Date: Thu, 29 Dec 2016 07:37:39 -0800 Subject: [PATCH 004/118] Always fetch passed in items (#107) In order to get the updated score, we need to call fetch items every time. --- src/store/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index ca0818745..c0fcc6233 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -36,8 +36,6 @@ const store = new Vuex.Store({ }, FETCH_ITEMS: ({ commit, state }, { ids }) => { - // only fetch items that we don't already have. - ids = ids.filter(id => !state.items[id]) if (ids.length) { return fetchItems(ids).then(items => commit('SET_ITEMS', { items })) } else { From 28bc4d3d5aade1037b482f2e5a7c13cddd861b21 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 29 Dec 2016 10:31:23 -0500 Subject: [PATCH 005/118] fix docs link --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 1d1c1abd3..ccba26f10 100644 --- a/server.js +++ b/server.js @@ -31,7 +31,7 @@ if (isProd) { } function createRenderer (bundle) { - // https://github.com/vuejs/vue/blob/next/packages/vue-server-renderer/README.md#why-use-bundlerenderer + // https://github.com/vuejs/vue/blob/dev/packages/vue-server-renderer/README.md#why-use-bundlerenderer return require('vue-server-renderer').createBundleRenderer(bundle, { cache: require('lru-cache')({ max: 1000, From 0e2b0a16fc7e0510439a2b39afd4a3bbfa9b7519 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 29 Dec 2016 13:09:36 -0500 Subject: [PATCH 006/118] fix memory leak (fix #88 & #93) --- src/store/api.js | 4 +++- src/store/create-api-server.js | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/store/api.js b/src/store/api.js index ad742c93c..e07a57f2e 100644 --- a/src/store/api.js +++ b/src/store/api.js @@ -2,7 +2,9 @@ import api from 'create-api' // warm the front page cache every 15 min -if (api.cachedIds) { +// make sure to do this only once across all requests +if (api.onServer && !api.warmCacheStarted) { + api.warmCacheStarted = true warmCache() } diff --git a/src/store/create-api-server.js b/src/store/create-api-server.js index 30a552fd4..ff04a1cd1 100644 --- a/src/store/create-api-server.js +++ b/src/store/create-api-server.js @@ -1,5 +1,6 @@ import Firebase from 'firebase' import LRU from 'lru-cache' +import { fetchItems } from './api' let api const config = { @@ -12,6 +13,7 @@ if (process.__API__) { } else { Firebase.initializeApp(config) api = process.__API__ = Firebase.database().ref(version) + api.onServer = true // fetched item cache api.cachedItems = LRU({ From ade06c60c0c3db9b5df16be7765667d88b23a1be Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 29 Dec 2016 13:18:58 -0500 Subject: [PATCH 007/118] limit client store item cache to 3 minutes --- src/store/index.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/store/index.js b/src/store/index.js index c0fcc6233..e353bbfec 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -36,6 +36,19 @@ const store = new Vuex.Store({ }, FETCH_ITEMS: ({ commit, state }, { ids }) => { + // on the client, the store itself serves as a cache. + // only fetch items that we do not already have, or has expired (3 minutes) + const now = Date.now() + ids = ids.filter(id => { + const item = state.items[id] + if (!item) { + return true + } + if (now - item.__lastUpdated > 1000 * 60 * 3) { + return true + } + return false + }) if (ids.length) { return fetchItems(ids).then(items => commit('SET_ITEMS', { items })) } else { From 38dea776780f00011ee8b5946ba0a612d9181d12 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 29 Dec 2016 13:28:08 -0500 Subject: [PATCH 008/118] bump deps --- build/webpack.base.config.js | 3 ++ package.json | 10 ++-- yarn.lock | 90 ++++++++++++++++++------------------ 3 files changed, 53 insertions(+), 50 deletions(-) diff --git a/build/webpack.base.config.js b/build/webpack.base.config.js index 1bfd0b787..cb402d0b8 100644 --- a/build/webpack.base.config.js +++ b/build/webpack.base.config.js @@ -50,5 +50,8 @@ module.exports = { } } ] + }, + performance: { + hints: process.env.NODE_ENV === 'production' ? 'warning' : false } } diff --git a/package.json b/package.json index bf6f215ec..e1172ba36 100644 --- a/package.json +++ b/package.json @@ -23,10 +23,10 @@ "lru-cache": "^4.0.2", "serialize-javascript": "^1.3.0", "serve-favicon": "^2.3.2", - "vue": "^2.1.3", + "vue": "^2.1.8", "vue-router": "^2.1.0", - "vue-server-renderer": "^2.1.3", - "vuex": "^2.0.0", + "vue-server-renderer": "^2.1.8", + "vuex": "^2.1.0", "vuex-router-sync": "^4.0.2" }, "devDependencies": { @@ -43,8 +43,8 @@ "sw-precache-webpack-plugin": "^0.7.0", "url-loader": "^0.5.7", "vue-loader": "^10.0.2", - "vue-template-compiler": "^2.1.3", - "webpack": "^2.1.0-beta.26", + "vue-template-compiler": "^2.1.8", + "webpack": "^2.2.0-rc.3", "webpack-dev-middleware": "^1.8.4", "webpack-hot-middleware": "^2.13.2" } diff --git a/yarn.lock b/yarn.lock index 812509b5f..d0667850b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,12 +38,12 @@ acorn@^4.0.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" ajv-keywords@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.4.1.tgz#f080e635e230baae26537ce727f260ae62b43802" + version "1.5.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.0.tgz#c11e6859eafff83e0dafc416929472eca946aa2c" ajv@^4.7.0: - version "4.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.10.2.tgz#27a61437962cb6daf8023ca9ad2a30337d918dda" + version "4.10.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.10.3.tgz#3e4fea9675b157de7888b80dd0ed735b83f28e11" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" @@ -137,8 +137,8 @@ arrify@^1.0.0: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" asn1.js@^4.0.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.0.tgz#f71a1243f3e79d46d7b07d7fbf4824ee73af054a" + version "4.9.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" dependencies: bn.js "^4.0.0" inherits "^2.0.1" @@ -835,8 +835,8 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" debug@*: - version "2.5.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.5.1.tgz#9107bb4a506052ec2a02314bc606313ed2b921c1" + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" dependencies: ms "0.7.2" @@ -998,14 +998,14 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" -enhanced-resolve@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-2.3.0.tgz#a115c32504b6302e85a76269d7a57ccdd962e359" +enhanced-resolve@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.0.2.tgz#0fa709f29e59ee23e6bbcb070c85f992d6247cd1" dependencies: graceful-fs "^4.1.2" - memory-fs "^0.3.0" + memory-fs "^0.4.0" object-assign "^4.0.1" - tapable "^0.2.3" + tapable "^0.2.5" enhanced-resolve@~0.9.0: version "0.9.1" @@ -1690,8 +1690,8 @@ js-base64@^2.1.9: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" js-beautify@^1.6.3: - version "1.6.4" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.6.4.tgz#a9af79699742ac9a1b6fddc1fdbc78bc4d515fc3" + version "1.6.7" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.6.7.tgz#138bbe5f3a70e5674eaad6edc16617210ff037dd" dependencies: config-chain "~1.1.5" editorconfig "^0.13.2" @@ -1914,16 +1914,16 @@ memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" -memory-fs@^0.3.0, memory-fs@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" dependencies: errno "^0.1.3" readable-stream "^2.0.1" -memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" +memory-fs@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -2438,8 +2438,8 @@ postcss-minify-gradients@^1.0.1: postcss-value-parser "^3.3.0" postcss-minify-params@^1.0.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.1.tgz#c899444d9e2ff8933018befac151fbfadf10e737" + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" dependencies: alphanum-sort "^1.0.1" postcss "^5.0.2" @@ -2563,8 +2563,8 @@ postcss-zindex@^2.0.1: uniqs "^2.0.0" postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.6: - version "5.2.7" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.7.tgz#e38fb8370b7c0703922ecefdf21256c5f4b8d369" + version "5.2.8" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.8.tgz#05720c49df23c79bda51fd01daeb1e9222e94390" dependencies: chalk "^1.1.3" js-base64 "^2.1.9" @@ -3147,8 +3147,8 @@ svgo@^0.7.0: whet.extend "~0.9.9" sw-precache-webpack-plugin@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.7.0.tgz#b111935244debb503c26193f91564375524b452e" + version "0.7.1" + resolved "https://registry.yarnpkg.com/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.7.1.tgz#25a935b34ecf93a33beec8aa5daf573bc13f05ff" dependencies: del "^2.2.2" sw-precache "^4.1.0" @@ -3178,7 +3178,7 @@ tapable@^0.1.8, tapable@~0.1.8: version "0.1.10" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" -tapable@^0.2.3, tapable@~0.2.3: +tapable@^0.2.5, tapable@~0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.5.tgz#1ff6ce7ade58e734ca9bfe36ba342304b377a4d0" @@ -3252,7 +3252,7 @@ type-is@~1.6.13: media-typer "0.3.0" mime-types "~2.1.13" -uglify-js@~2.7.3, uglify-js@2.7.x: +uglify-js@^2.7.5, uglify-js@~2.7.3, uglify-js@2.7.x: version "2.7.5" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" dependencies: @@ -3391,9 +3391,9 @@ vue-router@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-2.1.1.tgz#10c31bbdcb6da92bd3e0223fa12345e73018625a" -vue-server-renderer@^2.1.3: - version "2.1.7" - resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.1.7.tgz#e3e17af044094209061282b57d27b14e0e6f39f1" +vue-server-renderer@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.1.8.tgz#834f2fc940b87f6f9bc6a1c8a604fddd5e6283ba" dependencies: de-indent "^1.0.2" he "^1.1.0" @@ -3404,9 +3404,9 @@ vue-style-loader@^1.0.0: dependencies: loader-utils "^0.2.7" -vue-template-compiler@^2.1.3: - version "2.1.7" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.1.7.tgz#5e1fc983271d3ac24c79abb64b71383357e2cea5" +vue-template-compiler@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.1.8.tgz#12dd1cc63793f59be580c694a61610cb9369d629" dependencies: de-indent "^1.0.2" he "^1.1.0" @@ -3415,15 +3415,15 @@ vue-template-es2015-compiler@^1.2.2: version "1.4.2" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.4.2.tgz#0bc595cda68fc27779568926fcead13553a335df" -vue@^2.1.3: - version "2.1.7" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.1.7.tgz#747880cb70a50c66cb8791aacfee7a6dab7fc842" +vue@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.1.8.tgz#ae30aa86024fccf5535292ce414e7b4c221a1756" vuex-router-sync@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/vuex-router-sync/-/vuex-router-sync-4.0.2.tgz#46e949f28a5d7275385a8300495752c34da0aeef" -vuex@^2.0.0: +vuex@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/vuex/-/vuex-2.1.1.tgz#78463ee45fae4871c5d05177b4e8cedd9e2cbccc" @@ -3495,16 +3495,16 @@ webpack@*: watchpack "^0.2.1" webpack-core "~0.6.9" -webpack@^2.1.0-beta.26: - version "2.1.0-beta.28" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.1.0-beta.28.tgz#8f9402c05bae04ab8d3918489b3547544a2e2641" +webpack@^2.2.0-rc.3: + version "2.2.0-rc.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.2.0-rc.3.tgz#ac072c06c88aae75abdfd33510e7c5fd965f843f" dependencies: acorn "^4.0.3" acorn-dynamic-import "^2.0.0" ajv "^4.7.0" ajv-keywords "^1.1.1" async "^2.1.2" - enhanced-resolve "^2.2.0" + enhanced-resolve "^3.0.0" interpret "^1.0.0" json-loader "^0.5.4" loader-runner "^2.2.0" @@ -3515,8 +3515,8 @@ webpack@^2.1.0-beta.26: object-assign "^4.0.1" source-map "^0.5.3" supports-color "^3.1.0" - tapable "~0.2.3" - uglify-js "~2.7.3" + tapable "~0.2.5" + uglify-js "^2.7.5" watchpack "^1.0.0" webpack-sources "^0.1.0" yargs "^6.0.0" From f5ca53ac72356b2ae963a90cb61da0dc85d8d2b2 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 29 Dec 2016 13:44:55 -0500 Subject: [PATCH 009/118] tweak server --- server.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/server.js b/server.js index ccba26f10..651de21af 100644 --- a/server.js +++ b/server.js @@ -1,6 +1,3 @@ -process.env.VUE_ENV = 'server' -const isProd = process.env.NODE_ENV === 'production' - const fs = require('fs') const path = require('path') const express = require('express') @@ -9,6 +6,11 @@ const compression = require('compression') const serialize = require('serialize-javascript') const resolve = file => path.resolve(__dirname, file) +const isProd = process.env.NODE_ENV === 'production' +const serverInfo = + `express/${require('express/package.json').version} ` + + `vue-server-renderer/${require('vue-server-renderer/package.json').version}` + const app = express() let indexHTML // generated by html-webpack-plugin @@ -65,7 +67,9 @@ app.get('*', (req, res) => { return res.end('waiting for compilation... refresh in a moment.') } - res.setHeader("Content-Type", "text/html"); + res.setHeader("Content-Type", "text/html") + res.setHeader("Server", serverInfo) + var s = Date.now() const context = { url: req.url } const renderStream = renderer.renderToStream(context) From b04ea0c453ce2bdf2de95f26363d95e0ab9c7115 Mon Sep 17 00:00:00 2001 From: Limon Monte Date: Wed, 18 Jan 2017 15:56:38 +0200 Subject: [PATCH 010/118] Improve UI by adding 2nd paginator and making 1st one movable (#54) * Make NewsListNav standalone component * UI improvement: add 2nd NewsListNav to the bottom, make 1st movable * Use kebab-case --- src/App.vue | 7 +----- src/components/ItemList.vue | 41 ++++++---------------------------- src/components/NewsListNav.vue | 39 ++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 40 deletions(-) create mode 100644 src/components/NewsListNav.vue diff --git a/src/App.vue b/src/App.vue index b71821a77..3f29bde08 100644 --- a/src/App.vue +++ b/src/App.vue @@ -16,7 +16,7 @@ - + @@ -76,11 +76,6 @@ a display inline-block vertical-align middle -.view - max-width 800px - margin 0 auto - position relative - .fade-enter-active, .fade-leave-active transition all .2s ease diff --git a/src/components/ItemList.vue b/src/components/ItemList.vue index 9c0001da1..8f23eecfc 100644 --- a/src/components/ItemList.vue +++ b/src/components/ItemList.vue @@ -1,13 +1,7 @@ From 4114eff3770a7fab72dea17b717d893296c87d41 Mon Sep 17 00:00:00 2001 From: Pius Nyakoojo Date: Wed, 18 Jan 2017 14:18:46 -0600 Subject: [PATCH 011/118] Update App.vue header (#122) The
element specifies a header for a document or section. The