├── .babelrc
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .postcssrc.js
├── LICENSE
├── README.md
├── _config.yml
├── app.js
├── build
├── build.js
├── check-versions.js
├── logo.png
├── utils.js
├── vue-loader.conf.js
├── webpack.base.conf.js
├── webpack.dev.conf.js
└── webpack.prod.conf.js
├── client.js
├── config
├── dev.env.js
├── index.js
├── prod.env.js
└── proxy.js
├── dist
├── favicon.ico
├── hot
│ └── index.html
├── index.html
├── now
│ └── index.html
└── static
│ ├── css
│ ├── app.8f75c41be5c651e364e7697874bdbebb.css
│ └── app.8f75c41be5c651e364e7697874bdbebb.css.map
│ └── js
│ ├── 0.b52b0373ff6b3a580820.js
│ ├── 0.b52b0373ff6b3a580820.js.map
│ ├── 1.17756f7ae31222eae231.js
│ ├── 1.17756f7ae31222eae231.js.map
│ ├── 2.418619809e7e438d6206.js
│ ├── 2.418619809e7e438d6206.js.map
│ ├── 3.811c14d3fc363f56f053.js
│ ├── 3.811c14d3fc363f56f053.js.map
│ ├── 4.d12b786ae98a68fdb5f0.js
│ ├── 4.d12b786ae98a68fdb5f0.js.map
│ ├── app.dc8137b45381d871d00a.js
│ ├── app.dc8137b45381d871d00a.js.map
│ ├── manifest.4276fa394328a9f55052.js
│ ├── manifest.4276fa394328a9f55052.js.map
│ ├── vendor.a0ae2a66fe262215a11b.js
│ └── vendor.a0ae2a66fe262215a11b.js.map
├── index.html
├── index.template.html
├── jsconfig.json
├── package-lock.json
├── package.json
├── server.js
├── src
├── App.vue
├── api
│ ├── ajax.js
│ └── index.js
├── assets
│ ├── chat.svg
│ └── logo.png
├── common
│ ├── css
│ │ └── border.css
│ └── stylus
│ │ ├── base.styl
│ │ ├── index.styl
│ │ ├── mixin.styl
│ │ ├── reset.styl
│ │ └── variable.styl
├── components
│ ├── HelloWorld.vue
│ ├── footer
│ │ └── footer.vue
│ ├── hot
│ │ └── hot.vue
│ ├── list
│ │ └── list.vue
│ ├── listDetail
│ │ └── listDetail.vue
│ ├── loading
│ │ ├── loading.gif
│ │ └── loading.vue
│ ├── nodes
│ │ └── nodeList.vue
│ ├── now
│ │ └── now.vue
│ ├── scroll
│ │ └── scroll.vue
│ └── userDetail
│ │ ├── index.js
│ │ └── userDetail.vue
├── entry-client.js
├── entry-server.js
├── main.js
├── responsive.js
├── router
│ └── index.js
├── server-app.js
└── server-router.js
└── static
└── .gitkeep
/.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 | }
13 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | /build/
2 | /config/
3 | /dist/
4 | /*.js
5 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | // http://eslint.org/docs/user-guide/configuring
2 | //
3 |
4 | // const globalVas = ['$', '_','DF', 'createjs', 'TweenMax', 'THREE', 'd3', 'require', 'window', 'document', 'test', 'expect', 'process', 'describe', 'Velocity']
5 | // const getEslintVarsGlobals = () => {
6 | // let gObj = {};
7 | // globalVas.map(v => {
8 | // gObj[v] = true
9 | // })
10 | // return gObj
11 | // }
12 |
13 | const eslintConfig = {
14 | root: true,
15 | parser: 'babel-eslint',
16 | parserOptions: {
17 | ecmaVersion: 2017,
18 | sourceType: 'module',
19 | ecmaFeatures: {
20 | experimentalObjectRestSpread: true,
21 | jsx: true
22 | }
23 | },
24 | env: {
25 | browser: true,
26 | node: true,
27 | es6: true,
28 | },
29 | // extends: 'vue',
30 | // required to lint *.vue files
31 | plugins: [
32 | 'html'
33 | ],
34 | // add your custom rules here
35 | 'rules': {
36 | // 强制行的最大长度 默认80个
37 | "max-len": [1, {
38 | "code": 150
39 | }],
40 | // 变量引号
41 | "quotes": [1, "single", {
42 | "allowTemplateLiterals": true
43 | }],
44 | // 缩进4个空格 swtich case缩进
45 | "indent": [2, 4, {
46 | "SwitchCase": 1,
47 | "VariableDeclarator": 1
48 | }],
49 | // 要求或禁止使用分号代替
50 | "semi": [0, "always"],
51 | // 不允许非空数组里面有多余的空格
52 | "array-bracket-spacing": [2, "never"],
53 | // 不允许函数括号之间存在空格
54 | "space-before-function-paren": ["error", "never"],
55 | // 强制 getter 和 setter 在对象中成对出现
56 | "accessor-pairs": 1,
57 | // 强制 要求箭头函数的箭头之前或之后有空格
58 | "arrow-spacing": 2,
59 | // 块语句作用域中禁止使用var 先声明再在块里使用
60 | "block-scoped-var": 2,
61 | // 大括号风格要求
62 | "brace-style": [1, "1tbs", {
63 | "allowSingleLine": true
64 | }],
65 | // 对象属性中禁止使用空格 obj[foo ] obj[ 'foo']
66 | "computed-property-spacing": 2,
67 | // 要求使用骆驼拼写法
68 | "camelcase": 0,
69 | // 对象字面量项尾不能有逗号
70 | "comma-dangle": [2, "never"],
71 | // 逗号前后的空格
72 | "comma-spacing": [2, {
73 | "before": false,
74 | "after": true
75 | }],
76 | // this别名 that ,self ,me
77 | "consistent-this": [1, "me"],
78 | // 要求 switch 语句中有 default 分支
79 | "default-case": 2,
80 | // 点号操作符应该和属性在同一行
81 | "dot-location": [2, "property"],
82 | // 要求使用 === 和 !== (比较两个字面量的 、 比较 typeof 的值 、与 null 进行比较 可以)
83 | "eqeqeq": [1, "smart"],
84 | // 要求使用函数声明 而不是函数表达式 避免作用域提升
85 | "func-style": [1, "declaration", {
86 | "allowArrowFunctions": true
87 | }],
88 | // 强制块语句的最大可嵌套深度 最大4层
89 | "max-depth": 2,
90 | // 限制函数定义中最大参数个数 4个最多
91 | "max-params": [2, 5],
92 | // 要求调用无参构造函数时带括号
93 | "new-parens": 2,
94 | // 禁止alert
95 | "no-alert": 2,
96 | // 禁止使用 Array 构造函数 因为容易全局层面被重写
97 | "no-array-constructor": 2,
98 | // 禁止位操作符
99 | "no-bitwise": 2,
100 | // 禁用 arguments.caller 或 arguments.callee
101 | "no-caller": 2,
102 | // 禁止箭头函数 中使用 三元表达式
103 | "no-confusing-arrow": 2,
104 | // console不禁用
105 | "no-console": 0,
106 | // 禁止使用看起来像除法的正则表达式
107 | "no-div-regex": 2,
108 | // 禁止debuuger 生产模式中
109 | "no-debugger": process.env.NODE_ENV !== 'production' ? 0 : 2,
110 | // 禁止一个模块 重复导入
111 | "no-duplicate-imports": 2,
112 | // 禁止 if 语句中 return 语句之后有 else 块
113 | "no-else-return": 2,
114 | // 禁止label
115 | "no-empty-label": 0,
116 | // 禁止空的块级代码
117 | "no-empty": 2,
118 | // 禁eval
119 | "no-eval": 2,
120 | // 禁止扩展原生对象
121 | "no-extend-native": 2,
122 | // 禁止不必要的函数绑定
123 | "no-extra-bind": 2,
124 | // 禁止冗余的括号
125 | "no-extra-parens": 2,
126 | // 禁止浮点小数 缩写写法 例如.3 、 2. => 0.3 、2.0
127 | "no-floating-decimal": 2,
128 | // 禁止使用类似 eval() 的方法
129 | "no-implied-eval": 2,
130 | // 禁止使用内联注释
131 | "no-inline-comments": 2,
132 | // 禁用 __iterator__ 属性
133 | "no-iterator": 2,
134 | // 禁用不必要的嵌套块
135 | "no-lone-blocks": 2,
136 | // 禁止循环中存在函数
137 | "no-loop-func": 2,
138 | // 禁止 require 调用与普通变量声明混合使用
139 | "no-mixed-requires": 2,
140 | // 禁止使用嵌套的三元表达式
141 | "no-nested-ternary": 0,
142 | // 禁用Function构造函数 new Function()
143 | "no-new-func": 2,
144 | // 禁止使用 Object 构造函数 直接 var obj = {}
145 | "no-new-object": 2,
146 | // 禁止调用 require 时使用 new 操作符
147 | "no-new-require": 2,
148 | // 禁止原始包装实例 new String('abc') => String('abc')
149 | "no-new-wrappers": 2,
150 | // 禁止new实例后 不赋值
151 | "no-new": 2,
152 | // 禁止在字符串字面量中使用八进制转义序列
153 | "no-octal-escape": 2,
154 | // 当使用 _dirname 和 _filename 时不允许字符串拼接
155 | "no-path-concat": 2,
156 | // 禁用__proto__ 正确: var a = Object.getPrototypeOf(obj);
157 | "no-proto": 2,
158 | // 禁用 Node.js 模块
159 | "no-restricted-modules": 2,
160 | // 禁止在 return 语句中使用赋值语句
161 | "no-return-assign": 2,
162 | // 禁止自身比较
163 | "no-self-compare": 2,
164 | // 禁止使用逗号运算符
165 | "no-sequences": 2,
166 | // 禁止赋值关键字
167 | "no-shadow-restricted-names": 2,
168 | // 禁止在构造函数中,在调用 super() 之前使用 this 或 super
169 | "no-this-before-super": 2,
170 | // 禁止抛出字面量错误 throw "error";
171 | "no-throw-literal": 2,
172 | // 禁用行尾空白
173 | "no-trailing-spaces": 2,
174 | // 禁止将变量初始化为 undefined
175 | "no-undef-init": 2,
176 | // 禁止 更简单的可替代的 表达式时使用三元操作符 isYes = answer === 1 ? true : false;
177 | "no-unneeded-ternary": 2,
178 | // 禁止未使用过的表达式
179 | "no-unused-expressions": [2, {
180 | "allowTernary": true
181 | }],
182 | // 禁止未使用过的变量
183 | "no-unused-vars": [1, {
184 | "vars": "all",
185 | "argsIgnorePattern": "\(h\)",
186 | "args": "after-used" // 最后一个参数必须使用。如:一个函数有两个参数,你使用了第二个参数,ESLint 不会报警告。
187 | }],
188 | // 禁止定义前使用
189 | "no-use-before-define": 2,
190 | // 禁用不必要的 .call() 和 .apply()
191 | "no-useless-call": 2,
192 | // 禁止没有必要的字符拼接
193 | "no-useless-concat": 2,
194 | // 禁用 void 操作符
195 | "no-void": 2,
196 | // 要求对象字面量简写语法 es6 标准
197 | "object-shorthand": ["off", "always", {
198 | "avoidQuotes": true
199 | }],
200 | // 要求或禁止尽可能地简化赋值操作
201 | "operator-assignment": 2,
202 | // 强制操作符使用一致的换行符风格
203 | "operator-linebreak": [2, "after"],
204 | // 要求使用 const 声明那些声明后不再被修改的变量
205 | "prefer-const": 0,
206 | // 建议使用扩展运算符而非.apply()
207 | "prefer-spread": 2,
208 | // parseInt必须带第二个参数
209 | "radix": 2,
210 | // 变量排序
211 | "sort-vars": 0,
212 | // 要求正则表达式被包裹起来
213 | "wrap-regex": 2,
214 | // 要求箭头函数的参数使用圆括号 "as-needed" 当只有一个参数时允许省略圆括号。
215 | "arrow-parens": [2, "as-needed"],
216 | }
217 | }
218 |
219 |
220 | module.exports = eslintConfig
221 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | npm-debug.log*
4 | yarn-debug.log*
5 | yarn-error.log*
6 |
7 | # Editor directories and files
8 | .idea
9 | .vscode
10 | *.suo
11 | *.ntvs*
12 | *.njsproj
13 | *.sln
14 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | // "postcss-import": {},
6 | // "postcss-url": {},
7 | // to edit target browsers: use "browserslist" field in package.json
8 | "autoprefixer": {},
9 | "postcss-pxtorem": {
10 | "rootValue": 100,
11 | "propWhiteList": []
12 | }
13 | // "postcss-aspect-ratio-mini": {},
14 | // "postcss-write-svg": {
15 | // utf8: false
16 | // },
17 | // "postcss-cssnext": {},
18 | // "postcss-px-to-viewport": {
19 | // viewportWidth: 750,
20 | // viewportHeight: 1334,
21 | // unitPrecision: 3,
22 | // viewportUnit: 'vw',
23 | // selectorBlackList: ['.ignore', '.hairlines'],
24 | // minPixelValue: 1,
25 | // mediaQuery: false
26 | // },
27 | // "postcss-viewport-units": {},
28 | // "cssnano": {
29 | // preset: "advanced",
30 | // autoprefixer: false,
31 | // "postcss-zindex": false
32 | // }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 hangzou
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # v2ex-vue
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 | # 注意,需要启动node服务
21 |
22 | node server.js
23 | ```
24 | #### 项目已经部署在[heroku.com](https://v2ex-vue.herokuapp.com/)
25 | **[访问leanapp.cn,更快](http://v2er.leanapp.cn/#/now)**
26 | - [x] 主要技术为 vue全家桶,stylus,v-lazy,better-scroll;实现下拉刷新,懒加载功能
27 | - [x] 后端为express,实现了express转发接口,跨域,实现接口自定义。
28 | - [x] 使用vh,vw + postcss 实现移动端适配,rem适配方案升级版
29 | - [ ] 分页(未实现,目前的思路为,在server.js通过切割数组来模拟)
30 | - [ ] 上拉加载(未实现)
31 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | const Vue = require('vue')
2 |
3 | module.exports = function(context) {
4 | return new Vue({
5 | data: {
6 | url: context.url
7 | },
8 | template: `
访问的 URL 是: {{ url }}
`
9 | })
10 | }
11 |
--------------------------------------------------------------------------------
/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 | })
42 |
--------------------------------------------------------------------------------
/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 | }
55 |
--------------------------------------------------------------------------------
/build/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/build/logo.png
--------------------------------------------------------------------------------
/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 | }
102 |
--------------------------------------------------------------------------------
/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 | }
23 |
--------------------------------------------------------------------------------
/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 |
7 | function resolve (dir) {
8 | return path.join(__dirname, '..', dir)
9 | }
10 |
11 | const createLintingRule = () => ({
12 | test: /\.(js|vue)$/,
13 | loader: 'eslint-loader',
14 | enforce: 'pre',
15 | include: [resolve('src'), resolve('test')],
16 | options: {
17 | formatter: require('eslint-friendly-formatter')
18 | // emitWarning: !config.dev.showEslintErrorsInOverlay
19 | }
20 | })
21 |
22 | module.exports = {
23 | context: path.resolve(__dirname, '../'),
24 | entry: {
25 | app: './src/main.js'
26 | },
27 | output: {
28 | path: config.build.assetsRoot,
29 | filename: '[name].js',
30 | publicPath: process.env.NODE_ENV === 'production'
31 | ? config.build.assetsPublicPath
32 | : config.dev.assetsPublicPath
33 | },
34 | resolve: {
35 | extensions: ['.js', '.vue', '.json'],
36 | alias: {
37 | 'vue$': 'vue/dist/vue.esm.js',
38 | '@': resolve('src'),
39 | 'components': resolve('src/components'),
40 | 'api': resolve('src/api')
41 | }
42 | },
43 | module: {
44 | rules: [
45 | ...(config.dev.useEslint ? [createLintingRule()] : []),
46 | {
47 | test: /\.vue$/,
48 | loader: 'vue-loader',
49 | options: vueLoaderConfig
50 | },
51 | {
52 | test: /\.js$/,
53 | loader: 'babel-loader',
54 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
55 | },
56 | {
57 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
58 | loader: 'url-loader',
59 | options: {
60 | limit: 10000,
61 | name: utils.assetsPath('img/[name].[hash:7].[ext]')
62 | }
63 | },
64 | {
65 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
66 | loader: 'url-loader',
67 | options: {
68 | limit: 10000,
69 | name: utils.assetsPath('media/[name].[hash:7].[ext]')
70 | }
71 | },
72 | {
73 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
74 | loader: 'url-loader',
75 | options: {
76 | limit: 10000,
77 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
78 | }
79 | }
80 | ]
81 | },
82 | node: {
83 | // prevent webpack from injecting useless setImmediate polyfill because Vue
84 | // source contains it (although only uses it if it's native).
85 | setImmediate: false,
86 | // prevent webpack from injecting mocks to Node native modules
87 | // that does not make sense for the client
88 | dgram: 'empty',
89 | fs: 'empty',
90 | net: 'empty',
91 | tls: 'empty',
92 | child_process: 'empty'
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/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 | const axios = require('axios')
13 | const proxyConf = require('../config/proxy')
14 | const qs = require('qs')
15 |
16 | const HOST = process.env.HOST
17 | const PORT = process.env.PORT && Number(process.env.PORT)
18 |
19 | const devWebpackConfig = merge(baseWebpackConfig, {
20 | module: {
21 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
22 | },
23 | // cheap-module-eval-source-map is faster for development
24 | devtool: config.dev.devtool,
25 |
26 | // these devServer options should be customized in /config/index.js
27 | devServer: {
28 | clientLogLevel: 'warning',
29 | historyApiFallback: {
30 | rewrites: [
31 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
32 | ],
33 | },
34 | hot: true,
35 | contentBase: false, // since we use CopyWebpackPlugin.
36 | compress: true,
37 | host: HOST || config.dev.host,
38 | port: PORT || config.dev.port,
39 | open: config.dev.autoOpenBrowser,
40 | overlay: config.dev.errorOverlay
41 | ? { warnings: false, errors: true }
42 | : false,
43 | publicPath: config.dev.assetsPublicPath,
44 | proxy: config.dev.proxyTable,
45 | before(app) {
46 | // const headerConf = {
47 | // referer: 'https://www.v2ex.com',
48 | // host: 'www.v2ex.com'
49 | // }
50 | // for (let k in proxyConf) {
51 | // app.get(k, function(req, res) {
52 | // axios.get(proxyConf[k], {
53 | // headers: headerConf,
54 | // params: req.query
55 | // }).then(response => {
56 | // res.json(response.data)
57 | // }).catch(e => {
58 | // console.log(e)
59 | // })
60 | // })
61 | // }
62 | // app.get('/api/now', function(req, res) {
63 | // var url = 'https://www.v2ex.com/api/topics/latest.json'
64 | // axios.get(url, {
65 | // headers: headerConf
66 | // }).then((response) => {
67 | // res.json(response.data)
68 | // }).catch((e) =>{
69 | // console.log(e)
70 | // })
71 | // })
72 | },
73 | quiet: true, // necessary for FriendlyErrorsPlugin
74 | watchOptions: {
75 | poll: config.dev.poll,
76 | }
77 | },
78 | plugins: [
79 | new webpack.optimize.CommonsChunkPlugin({
80 | name: 'vendor',
81 | minChunks: ({ resource }) => (
82 | resource &&
83 | resource.indexOf('node_modules') >= 0 &&
84 | resource.match(/\.js$/)
85 | )
86 | }),
87 | new webpack.DefinePlugin({
88 | 'process.env': require('../config/dev.env')
89 | }),
90 | new webpack.HotModuleReplacementPlugin(),
91 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
92 | new webpack.NoEmitOnErrorsPlugin(),
93 | // https://github.com/ampedandwired/html-webpack-plugin
94 | new HtmlWebpackPlugin({
95 | filename: 'index.html',
96 | template: 'index.html',
97 | inject: true
98 | }),
99 | // copy custom static assets
100 | new CopyWebpackPlugin([
101 | {
102 | from: path.resolve(__dirname, '../static'),
103 | to: config.dev.assetsSubDirectory,
104 | ignore: ['.*']
105 | }
106 | ])
107 | ]
108 | })
109 |
110 | module.exports = new Promise((resolve, reject) => {
111 | portfinder.basePort = process.env.PORT || config.dev.port
112 | portfinder.getPort((err, port) => {
113 | if (err) {
114 | reject(err)
115 | } else {
116 | // publish the new Port, necessary for e2e tests
117 | process.env.PORT = port
118 | // add port to devServer config
119 | devWebpackConfig.devServer.port = port
120 |
121 | // Add FriendlyErrorsPlugin
122 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
123 | compilationSuccessInfo: {
124 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
125 | },
126 | onErrors: config.dev.notifyOnErrors
127 | ? utils.createNotifierCallback()
128 | : undefined
129 | }))
130 |
131 | resolve(devWebpackConfig)
132 | }
133 | })
134 | })
135 |
--------------------------------------------------------------------------------
/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 | // const PrerenderSpaPlugin = require('prerender-spa-plugin')
14 |
15 | const env = require('../config/prod.env')
16 |
17 | const webpackConfig = merge(baseWebpackConfig, {
18 | module: {
19 | rules: utils.styleLoaders({
20 | sourceMap: config.build.productionSourceMap,
21 | extract: true,
22 | usePostCSS: true
23 | })
24 | },
25 | devtool: config.build.productionSourceMap ? config.build.devtool : false,
26 | output: {
27 | path: config.build.assetsRoot,
28 | filename: utils.assetsPath('js/[name].[chunkhash].js'),
29 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
30 | },
31 | plugins: [
32 | // http://vuejs.github.io/vue-loader/en/workflow/production.html
33 | new webpack.DefinePlugin({
34 | 'process.env': env
35 | }),
36 | new UglifyJsPlugin({
37 | uglifyOptions: {
38 | compress: {
39 | warnings: false
40 | }
41 | },
42 | sourceMap: config.build.productionSourceMap,
43 | parallel: true
44 | }),
45 | // extract css into its own file
46 | new ExtractTextPlugin({
47 | filename: utils.assetsPath('css/[name].[contenthash].css'),
48 | // Setting the following option to `false` will not extract CSS from codesplit chunks.
49 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
50 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
51 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
52 | allChunks: true,
53 | }),
54 | // Compress extracted CSS. We are using this plugin so that possible
55 | // duplicated CSS from different components can be deduped.
56 | new OptimizeCSSPlugin({
57 | cssProcessorOptions: config.build.productionSourceMap
58 | ? { safe: true, map: { inline: false } }
59 | : { safe: true }
60 | }),
61 | // generate dist index.html with correct asset hash for caching.
62 | // you can customize output by editing /index.html
63 | // see https://github.com/ampedandwired/html-webpack-plugin
64 | new HtmlWebpackPlugin({
65 | filename: config.build.index,
66 | template: 'index.html',
67 | inject: true,
68 | minify: {
69 | removeComments: true,
70 | collapseWhitespace: true,
71 | removeAttributeQuotes: true
72 | // more options:
73 | // https://github.com/kangax/html-minifier#options-quick-reference
74 | },
75 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin
76 | chunksSortMode: 'dependency'
77 | }),
78 | // keep module.id stable when vendor modules does not change
79 | new webpack.HashedModuleIdsPlugin(),
80 | // enable scope hoisting
81 | new webpack.optimize.ModuleConcatenationPlugin(),
82 | // split vendor js into its own file
83 | new webpack.optimize.CommonsChunkPlugin({
84 | name: 'vendor',
85 | minChunks (module) {
86 | // any required modules inside node_modules are extracted to vendor
87 | return (
88 | module.resource &&
89 | /\.js$/.test(module.resource) &&
90 | module.resource.indexOf(
91 | path.join(__dirname, '../node_modules')
92 | ) === 0
93 | )
94 | }
95 | }),
96 | // extract webpack runtime and module manifest to its own file in order to
97 | // prevent vendor hash from being updated whenever app bundle is updated
98 | new webpack.optimize.CommonsChunkPlugin({
99 | name: 'manifest',
100 | minChunks: Infinity
101 | }),
102 | // This instance extracts shared chunks from code splitted chunks and bundles them
103 | // in a separate chunk, similar to the vendor chunk
104 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
105 | new webpack.optimize.CommonsChunkPlugin({
106 | name: 'app',
107 | async: 'vendor-async',
108 | children: true,
109 | minChunks: 3
110 | }),
111 |
112 | // copy custom static assets
113 | new CopyWebpackPlugin([
114 | {
115 | from: path.resolve(__dirname, '../static'),
116 | to: config.build.assetsSubDirectory,
117 | ignore: ['.*']
118 | }
119 | ]),
120 | // new PrerenderSpaPlugin({
121 | // staticDir: path.join(__dirname, '../dist'),
122 |
123 | // // Optional - The path your rendered app should be output to.
124 | // // (Defaults to staticDir.)
125 | // // outputDir: path.join(__dirname, 'prerendered'),
126 |
127 | // // Optional - The location of index.html
128 | // // indexPath: path.join(__dirname, 'dist', 'index.html'),
129 |
130 | // // Required - Routes to render.
131 | // routes: ['/', '/now', '/hot']
132 | // })
133 | ]
134 | })
135 |
136 | if (config.build.productionGzip) {
137 | const CompressionWebpackPlugin = require('compression-webpack-plugin')
138 |
139 | webpackConfig.plugins.push(
140 | new CompressionWebpackPlugin({
141 | asset: '[path].gz[query]',
142 | algorithm: 'gzip',
143 | test: new RegExp(
144 | '\\.(' +
145 | config.build.productionGzipExtensions.join('|') +
146 | ')$'
147 | ),
148 | threshold: 10240,
149 | minRatio: 0.8
150 | })
151 | )
152 | }
153 |
154 | if (config.build.bundleAnalyzerReport) {
155 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
156 | webpackConfig.plugins.push(new BundleAnalyzerPlugin())
157 | }
158 |
159 | module.exports = webpackConfig
160 |
--------------------------------------------------------------------------------
/client.js:
--------------------------------------------------------------------------------
1 | const createApp = require('./app')
2 | const server = require('express')()
3 | const renderer = require('vue-server-renderer').createRenderer({
4 | template: require('fs').readFileSync('./index.template.html', 'utf-8')
5 | })
6 |
7 | const context = {
8 | title: '666',
9 | meta: `
10 |
11 |
12 | `
13 | }
14 |
15 | server.get('*', (req, res) => {
16 | const context = {
17 | url: req.url
18 | }
19 | const app = createApp(context)
20 | renderer.renderToString(app, (err, html) => {
21 | if (err) {
22 | console.log(err)
23 | res.status(500).end('Internal Server Error')
24 | return
25 | }
26 | res.setHeader('Content-Type', 'text/html;charset=UTF-8')
27 | res.end(html)
28 | })
29 | })
30 |
31 | server.listen(9527)
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const prodEnv = require('./prod.env')
4 |
5 | module.exports = merge(prodEnv, {
6 | NODE_ENV: '"development"',
7 | MOCK_URL: '"http://127.0.0.1:5000/api"',
8 | TRUE_URL: '"https://www.v2ex.com/api"'
9 | })
10 |
--------------------------------------------------------------------------------
/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 |
10 | // Paths
11 | assetsSubDirectory: 'static',
12 | assetsPublicPath: '/',
13 | proxyTable: {
14 | // '/api': { //将www.exaple.com印射为/apis
15 | // target: 'http://127.0.0.1:5000', // 接口域名
16 | // changeOrigin: true, //是否跨域
17 | // secure: false
18 | // }
19 | },
20 |
21 | // Various Dev Server settings
22 | host: '0.0.0.0', // can be overwritten by process.env.HOST
23 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
24 | autoOpenBrowser: false,
25 | errorOverlay: true,
26 | notifyOnErrors: true,
27 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
28 |
29 | // Use Eslint Loader?
30 | // If true, your code will be linted during bundling and
31 | // linting errors and warnings will be shown in the console.
32 | useEslint: true,
33 | // If true, eslint errors and warnings will also be shown in the error overlay
34 | // in the browser.
35 | showEslintErrorsInOverlay: false,
36 |
37 | /**
38 | * Source Maps
39 | */
40 |
41 | // https://webpack.js.org/configuration/devtool/#development
42 | devtool: 'cheap-module-eval-source-map',
43 |
44 | // If you have problems debugging vue-files in devtools,
45 | // set this to false - it *may* help
46 | // https://vue-loader.vuejs.org/en/options.html#cachebusting
47 | cacheBusting: true,
48 |
49 | cssSourceMap: true
50 | },
51 |
52 | build: {
53 | // Template for index.html
54 | index: path.resolve(__dirname, '../dist/index.html'),
55 |
56 | // Paths
57 | assetsRoot: path.resolve(__dirname, '../dist'),
58 | assetsSubDirectory: 'static',
59 | assetsPublicPath: '/',
60 |
61 | /**
62 | * Source Maps
63 | */
64 |
65 | productionSourceMap: true,
66 | // https://webpack.js.org/configuration/devtool/#production
67 | devtool: '#source-map',
68 |
69 | // Gzip off by default as many popular static hosts such as
70 | // Surge or Netlify already gzip all static assets for you.
71 | // Before setting to `true`, make sure to:
72 | // npm install --save-dev compression-webpack-plugin
73 | productionGzip: false,
74 | productionGzipExtensions: ['js', 'css'],
75 |
76 | // Run the build command with an extra argument to
77 | // View the bundle analyzer report after build finishes:
78 | // `npm run build --report`
79 | // Set to `true` or `false` to always turn it on or off
80 | bundleAnalyzerReport: process.env.npm_config_report
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | module.exports = {
3 | NODE_ENV: '"production"',
4 | MOCK_URL: '"/api"',
5 | TRUE_URL: '"https://www.v2ex.com/api"'
6 | }
7 |
--------------------------------------------------------------------------------
/config/proxy.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | '/api/now': 'https://www.v2ex.com/api/topics/latest.json',
3 | '/api/topics/latest.json': 'https://www.v2ex.com/api/topics/latest.json',
4 | '/api/hot': 'https://www.v2ex.com/api/topics/hot.json',
5 | '/api/topics/hot.json': 'https://www.v2ex.com/api/topics/hot.json',
6 | '/api/node': 'https://www.v2ex.com/api/nodes/show.json',
7 | '/api/userinfo': 'https://www.v2ex.com/api/members/show.json',
8 | '/api/replies/show.json': 'https://www.v2ex.com/api/replies/show.json',
9 | '/api/topics/show.json': 'https://www.v2ex.com/api/topics/show.json',
10 | '/api/members/show.json': 'https://www.v2ex.com/api/members/show.json'
11 | }
12 |
--------------------------------------------------------------------------------
/dist/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/dist/favicon.ico
--------------------------------------------------------------------------------
/dist/hot/index.html:
--------------------------------------------------------------------------------
1 | v2ex-vue
--------------------------------------------------------------------------------
/dist/index.html:
--------------------------------------------------------------------------------
1 | v2ex-vue
--------------------------------------------------------------------------------
/dist/now/index.html:
--------------------------------------------------------------------------------
1 | v2ex-vue
--------------------------------------------------------------------------------
/dist/static/css/app.8f75c41be5c651e364e7697874bdbebb.css:
--------------------------------------------------------------------------------
1 | .v-header{height:.44rem;-ms-flex-pack:center;justify-content:center;font-size:.36rem;font-weight:700;color:#000;z-index:99999}.footer,.v-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;background-color:#fff}.footer{-ms-flex-pack:justify;justify-content:space-between;position:fixed;height:.96rem;bottom:0;left:0;right:0;z-index:200}.footer .footer-item{-ms-flex:1;flex:1;height:100%;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;font-size:.2rem;color:#333}.footer .footer-item.router-link-active{color:#42b983}.v-list{width:100%;background-color:#eee;position:relative}.v-list .v-list__item{height:2.4rem;margin-bottom:.08rem;padding:0 .2rem;background-color:#fff}.v-list .v-list__item .v-list__detail{position:relative;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;height:1.2rem;padding-top:.2rem}.v-list .v-list__item .v-list__detail .v-list__img{width:1.1rem;height:1.1rem;border-radius:50%;margin-right:.2rem}.v-list .v-list__item .v-list__detail .v-list__desc{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around;height:100%}.v-list .v-list__item .v-list__detail .v-list__desc .v-list__desc--name{font-size:.36rem;color:#101010}.v-list .v-list__item .v-list__detail .v-list__desc .v-list__desc--time{font-size:.28rem;color:#b1b1b1}.v-list .v-list__item .v-list__node{position:absolute;top:.2rem;right:0}.v-list .v-list__item .v-list__node .v-list__node--title{border-radius:.04rem;background-color:#eee}.v-list .v-list__item .v-list__node .v-list__node--count,.v-list .v-list__item .v-list__node .v-list__node--title{display:inline-block;padding:.08rem;font-size:.24rem;color:#b7b7b7}.v-list .v-list__item .v-list__node .v-list__node--count img{width:.28rem;height:.28rem;position:relative;top:.04rem}.v-list .v-list__item .v-list__content{width:100%;height:1rem;padding-top:.2rem;line-height:1.25;font-size:.28rem;color:#101010;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2}.scroll-wrapper{position:fixed;top:0;bottom:.88rem;left:0;right:0}.loading{width:100%;text-align:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;height:.5rem}.loading .desc{line-height:.2rem;font-size:.24rem;color:#b7b7b7}@svg 1px-border{height:.02rem;@rect{fill:#eee;width:100%;height:50%}}.back{position:fixed;z-index:200;color:#000;border-bottom:.01rem solid #eee}.loading-wrapper{height:.5rem;overflow:hidden;transition:all .2s}.content-wrapper{overflow:hidden;top:.44rem;bottom:.88rem;padding:0 .2rem}.detail-header{height:.44rem;-ms-flex-pack:center;justify-content:center;position:relative;top:0;background-color:#fff;color:#777;padding:0 .2rem}.detail-header,.detail-header .icon-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%}.detail-header .icon-wrapper{height:100%}.list-detail{position:fixed;top:0;bottom:0;right:0;left:0;background:#fff}.list-detail .detail-title{font-size:.36rem;color:#000;padding:.2rem 0}.list-detail .detail-user{display:-ms-flexbox;display:flex}.list-detail .detail-user .user-avatar{width:.96rem;height:.96rem;border-radius:50%;margin-right:.1rem}.list-detail .detail-user .user-info{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around;padding:.1rem 0}.list-detail .detail-user .user-info .user-name{color:#000;font-size:.32rem}.list-detail .detail-user .user-info .user-node{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;font-size:.24rem;color:#b1b1b1}.list-detail .detail-content{padding:.1rem 0;font-size:.3rem;color:#000;line-height:1.5}.list-detail .detail-content p{margin-bottom:.2rem}.list-detail .detail-content img{max-width:100%}.list-detail .detail-reply{padding:.2rem 0}.list-detail .detail-reply .reply-item{position:relative;padding:.2rem 0;color:#000}.list-detail .detail-reply .reply-item .reply-content{padding:.1rem 0 .1rem 1.06rem;font-size:.28rem;line-height:1.5}.list-detail .detail-reply .reply-item .reply-content img{width:80%}.list-detail .detail-reply .reply-item .icon-heart{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;top:.2rem;right:0;color:red}.list-detail .detail-reply .reply-item .icon-heart .heart-count{display:inline-block;margin-left:.1rem;font-size:.24rem;color:#b1b1b1}.slider-enter-active,.slider-leave-active{transition:all .3s}.slider-enter,.slider-leave-to{transform:translate3d(100%,0,0)}.node-list{padding:.05rem .2rem}.node-list .node-name{width:100%;height:1rem;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.1rem .2rem 0;background-color:#eee;font-size:.32rem;color:#000}.node-list .node-childList{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.2rem;color:#b1b1b1;font-size:.28rem}.node-list .node-childList .child-item{padding:.1rem;margin-right:.2rem;margin-bottom:.2rem;background-color:#eee;border-radius:.04rem}.node-detail{position:absolute;overflow:hidden;width:100%;top:0;bottom:0;background-color:#fff}.node-detail .v-list{top:.44rem;bottom:.88rem}.node-detail .loading-wrapper{overflow:hidden}.node-detail .v-header{position:relative}.node-detail .v-header .icon-wrapper{position:absolute;top:50%;left:.2rem;transform:translateY(-50%);width:.8rem}.fade-enter-active,.fade-leave-active{transition:all .3s}.fade-enter,.fade-leave-to{opacity:0}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,html,i,iframe,img,input,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font-size:100%;font-weight:400;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,menu,nav,section{display:block}body{line-height:1}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:none}table{border-collapse:collapse;border-spacing:0}a{color:#7e8c8d;-webkit-backface-visibility:hidden;text-decoration:none}li{list-style:none}body{-webkit-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}body,html{line-height:1;font-family:PingFang SC,STHeitiSC-Light,Helvetica-Light,arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;background:#fff;color:#37c6c0}*,:after,:before{box-sizing:border-box}img{content:normal!important}@media (-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5){.border-1px:after{transform:scaleY(.7)}}@media (-webkit-min-device-pixel-ratio:2),(min-device-pixel-ratio:2){.border-1px:after{transform:scaleY(.5)}}.border-1px{border-top:.01rem solid #eee}.border-1px-b{border-bottom:.01rem solid #eee}.fa-icon{display:inline-block;fill:currentColor}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-spin{animation:fa-spin 1s 0s infinite linear}.fa-inverse{color:#fff}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.user-wrapper{position:fixed;top:0;left:0;bottom:0;right:0;z-index:9999;background-color:#fff}.user-wrapper .user-close{position:absolute;width:.4rem;height:.4rem;top:.2rem;right:.2rem;color:#42b983}.user-wrapper .user-inner{display:-ms-flexbox;display:flex;width:100%;padding-top:1.4rem;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.user-wrapper .user-inner .user-avatar{border-radius:50%}.user-wrapper .user-inner .user-time{margin-top:.4rem;color:#000;font-size:.3rem}.open-enter-active,.open-leave-active{transition:all .3s}.open-enter,.open-leave-to{opacity:0}
2 | /*# sourceMappingURL=app.8f75c41be5c651e364e7697874bdbebb.css.map */
--------------------------------------------------------------------------------
/dist/static/css/app.8f75c41be5c651e364e7697874bdbebb.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["app.8f75c41be5c651e364e7697874bdbebb.css"],"names":[],"mappings":"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","file":"app.8f75c41be5c651e364e7697874bdbebb.css","sourcesContent":["\n.v-header {\n height: 0.44rem;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n font-size: 0.36rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n z-index: 99999;\n}\n.footer {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: justify;\n -ms-flex-pack: justify;\n justify-content: space-between;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n position: fixed;\n height: 0.96rem;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 200;\n background-color: #fff;\n}\n.footer .footer-item {\n -webkit-box-flex: 1;\n -ms-flex: 1;\n flex: 1;\n height: 100%;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n font-size: 0.2rem;\n color: #333;\n}\n.footer .footer-item.router-link-active {\n color: #42b983;\n}\n.loading-wrapper {\n height: 0.5rem;\n overflow: hidden;\n -webkit-transition: all 0.2s;\n transition: all 0.2s;\n}\n.v-list {\n width: 100%;\n background-color: #eee;\n position: relative;\n}\n.v-list .v-list__item {\n height: 2.4rem;\n margin-bottom: 0.08rem;\n padding: 0 0.2rem;\n background-color: #fff;\n}\n.v-list .v-list__item .v-list__detail {\n position: relative;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n height: 1.2rem;\n padding-top: 0.2rem;\n}\n.v-list .v-list__item .v-list__detail .v-list__img {\n width: 1.1rem;\n height: 1.1rem;\n border-radius: 50%;\n margin-right: 0.2rem;\n}\n.v-list .v-list__item .v-list__detail .v-list__desc {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n height: 100%;\n}\n.v-list .v-list__item .v-list__detail .v-list__desc .v-list__desc--name {\n font-size: 0.36rem;\n color: #101010;\n}\n.v-list .v-list__item .v-list__detail .v-list__desc .v-list__desc--time {\n font-size: 0.28rem;\n color: #b1b1b1;\n}\n.v-list .v-list__item .v-list__node {\n position: absolute;\n top: 0.2rem;\n right: 0;\n}\n.v-list .v-list__item .v-list__node .v-list__node--title {\n display: inline-block;\n padding: 0.08rem;\n font-size: 0.24rem;\n border-radius: 0.04rem;\n color: #b7b7b7;\n background-color: #eee;\n}\n.v-list .v-list__item .v-list__node .v-list__node--count {\n display: inline-block;\n padding: 0.08rem;\n font-size: 0.24rem;\n color: #b7b7b7;\n}\n.v-list .v-list__item .v-list__node .v-list__node--count img {\n width: 0.28rem;\n height: 0.28rem;\n position: relative;\n top: 0.04rem;\n}\n.v-list .v-list__item .v-list__content {\n width: 100%;\n height: 1rem;\n padding-top: 0.2rem;\n line-height: calc(80 / 64);\n font-size: 0.28rem;\n color: #101010;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.scroll-wrapper {\n position: fixed;\n top: 0;\n bottom: 0.88rem;\n left: 0;\n right: 0;\n}\n.loading {\n width: 100%;\n text-align: center;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n height: 0.5rem;\n}\n.loading .desc {\n line-height: 0.2rem;\n font-size: 0.24rem;\n color: #b7b7b7;\n}\n@svg 1px-border {\n height: 0.02rem;\n@rect {\n fill: #eee;\n width: 100%;\n height: 50%;\n}\n}\n.back {\n position: fixed;\n z-index: 200;\n color: #000;\n border-bottom: 0.01rem solid #eee;\n}\n.loading-wrapper {\n height: 0.5rem;\n overflow: hidden;\n -webkit-transition: all 0.2s;\n transition: all 0.2s;\n}\n.content-wrapper {\n overflow: hidden;\n top: 0.44rem;\n bottom: 0.88rem;\n padding: 0 0.2rem;\n}\n.detail-header {\n height: 0.44rem;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 100%;\n position: relative;\n top: 0;\n background-color: #fff;\n color: #777;\n padding: 0 0.2rem;\n}\n.detail-header .icon-wrapper {\n width: 100%;\n height: 100%;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n.list-detail {\n position: fixed;\n top: 0;\n bottom: 0;\n right: 0;\n left: 0;\n background: #fff;\n}\n.list-detail .detail-title {\n font-size: 0.36rem;\n color: #000;\n padding: 0.2rem 0;\n}\n.list-detail .detail-user {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n}\n.list-detail .detail-user .user-avatar {\n width: 0.96rem;\n height: 0.96rem;\n border-radius: 50%;\n margin-right: 0.1rem;\n}\n.list-detail .detail-user .user-info {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n padding: 0.1rem 0;\n}\n.list-detail .detail-user .user-info .user-name {\n color: #000;\n font-size: 0.32rem;\n}\n.list-detail .detail-user .user-info .user-node {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n font-size: 0.24rem;\n color: #b1b1b1;\n}\n.list-detail .detail-content {\n padding: 0.1rem 0;\n font-size: 0.3rem;\n color: #000;\n line-height: 1.5;\n}\n.list-detail .detail-content p {\n margin-bottom: 0.2rem;\n}\n.list-detail .detail-content img {\n max-width: 100%;\n}\n.list-detail .detail-reply {\n padding: 0.2rem 0;\n}\n.list-detail .detail-reply .reply-item {\n position: relative;\n padding: 0.2rem 0;\n color: #000;\n}\n.list-detail .detail-reply .reply-item .reply-content {\n padding: 0.1rem 0 0.1rem 1.06rem;\n font-size: 0.28rem;\n line-height: 1.5;\n}\n.list-detail .detail-reply .reply-item .reply-content img {\n width: 80%;\n}\n.list-detail .detail-reply .reply-item .icon-heart {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n position: absolute;\n top: 0.2rem;\n right: 0;\n color: #f00;\n}\n.list-detail .detail-reply .reply-item .icon-heart .heart-count {\n display: inline-block;\n margin-left: 0.1rem;\n font-size: 0.24rem;\n color: #b1b1b1;\n}\n.slider-enter-active,\n.slider-leave-active {\n -webkit-transition: all 0.3s;\n transition: all 0.3s;\n}\n.slider-enter,\n.slider-leave-to {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n}\n.node-list {\n padding: 0.05rem 0.2rem;\n}\n.node-list .node-name {\n width: 100%;\n height: 1rem;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.1rem 0.2rem 0;\n background-color: #eee;\n font-size: 0.32rem;\n color: #000;\n}\n.node-list .node-childList {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding: 0.2rem;\n color: #b1b1b1;\n font-size: 0.28rem;\n}\n.node-list .node-childList .child-item {\n padding: 0.1rem;\n margin-right: 0.2rem;\n margin-bottom: 0.2rem;\n background-color: #eee;\n border-radius: 0.04rem;\n}\n.node-detail {\n position: absolute;\n overflow: hidden;\n width: 100%;\n top: 0;\n bottom: 0;\n background-color: #fff;\n}\n.node-detail .v-list {\n top: 0.44rem;\n bottom: 0.88rem;\n}\n.node-detail .loading-wrapper {\n overflow: hidden;\n}\n.node-detail .v-header {\n position: relative;\n}\n.node-detail .v-header .icon-wrapper {\n position: absolute;\n top: 50%;\n left: 0.2rem;\n -webkit-transform: translateY(-50%);\n transform: translateY(-50%);\n width: 0.8rem;\n}\n.fade-enter-active,\n.fade-leave-active {\n -webkit-transition: all 0.3s;\n transition: all 0.3s;\n}\n.fade-enter,\n.fade-leave-to {\n opacity: 0;\n}html,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\nb,\nu,\ni,\ncenter,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo,\ninput {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font-weight: normal;\n vertical-align: baseline;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nmenu,\nnav,\nsection {\n display: block;\n}\nbody {\n line-height: 1;\n}\nblockquote,\nq {\n quotes: none;\n}\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n content: none;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\na {\n color: #7e8c8d;\n -webkit-backface-visibility: hidden;\n text-decoration: none;\n}\nli {\n list-style: none;\n}\nbody {\n -webkit-text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\nbody,\nhtml {\n line-height: 1;\n font-family: 'PingFang SC', 'STHeitiSC-Light', 'Helvetica-Light', arial, sans-serif, 'Droid Sans Fallback';\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n background: #fff;\n color: #37c6c0;\n}\n*,\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\nimg {\n content: normal !important;\n}\n@media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5) {\n .border-1px::after {\n -webkit-transform: scaleY(0.7);\n transform: scaleY(0.7);\n }\n}\n@media (-webkit-min-device-pixel-ratio: 2), (min-device-pixel-ratio: 2) {\n .border-1px::after {\n -webkit-transform: scaleY(0.5);\n transform: scaleY(0.5);\n }\n}\n/*# sourceMappingURL=src/common/stylus/index.css.map *//* @svg 1px-border { \n height: 2px; \n @rect { \n fill: var(--color, black); \n width: 100%; \n height: 50%; \n } \n} */\n\n.border-1px { \n border-top: 0.01rem solid #eee; \n /* border-image: svg(1px-border param(--color #eee)) 2 2 stretch; */\n}\n\n.border-1px-b {\n border-bottom: 0.01rem solid #eee; \n /* border-image: svg(1px-border param(--color #eee)) 2 2 stretch; */\n}\n.fa-icon {\n display: inline-block;\n fill: currentColor;\n}\n.fa-flip-horizontal {\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n.fa-spin {\n -webkit-animation: fa-spin 1s 0s infinite linear;\n animation: fa-spin 1s 0s infinite linear;\n}\n.fa-inverse {\n color: #fff;\n}\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n}\n100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n}\n}\n@keyframes fa-spin {\n0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n}\n100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n}\n}\n\n.user-wrapper {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 9999;\n background-color: #fff;\n}\n.user-wrapper .user-close {\n position: absolute;\n width: 0.4rem;\n height: 0.4rem;\n top: 0.2rem;\n right: 0.2rem;\n color: #42b983;\n}\n.user-wrapper .user-inner {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n width: 100%;\n padding-top: 1.4rem;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n.user-wrapper .user-inner .user-avatar {\n border-radius: 50%;\n}\n.user-wrapper .user-inner .user-time {\n margin-top: 0.4rem;\n color: #000;\n font-size: 0.3rem;\n}\n.open-enter-active,\n.open-leave-active {\n -webkit-transition: all 0.3s;\n transition: all 0.3s;\n}\n.open-enter,\n.open-leave-to {\n opacity: 0;\n}"]}
--------------------------------------------------------------------------------
/dist/static/js/1.17756f7ae31222eae231.js:
--------------------------------------------------------------------------------
1 | webpackJsonp([1],{gyKk:function(t,e){},zI3V:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var s=n("Xxa5"),r=n.n(s),a=n("exGp"),i=n.n(a),o=n("Z7ab"),c=n("qqiS"),u=n("gyMJ"),f={data:function(){return{dataList:[],isLoad:!0}},mounted:function(){this.fetchList()},methods:{listDetail:function(t){this.$router.push({path:"/hot/"+t})},refresh:function(){var t=this;return i()(r.a.mark(function e(){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.fetchList();case 2:t.$refs.listBase.scroll.finishPullDown();case 3:case"end":return e.stop()}},e,t)}))()},fetchList:function(){var t=this;return i()(r.a.mark(function e(){var n;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(u.a)();case 2:n=e.sent,t.dataList=n,t.$refs.listBase.refresh();case 5:case"end":return e.stop()}},e,t)}))()},debounce:function(t,e){var n=void 0;return function(){for(var s=this,r=arguments.length,a=Array(r),i=0;i\n \n \n \n \n
\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/hot/hot.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"now\",staticClass:\"now\"},[_c('list-base',{ref:\"listBase\",attrs:{\"dataList\":_vm.dataList},on:{\"pullDown\":_vm.refresh,\"select\":_vm.listDetail}}),_vm._v(\" \"),_c('router-view')],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5479c288\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/hot/hot.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-5479c288\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!stylus-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./hot.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./hot.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./hot.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5479c288\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./hot.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/hot/hot.vue\n// module id = null\n// module chunks = "],"sourceRoot":""}
--------------------------------------------------------------------------------
/dist/static/js/2.418619809e7e438d6206.js:
--------------------------------------------------------------------------------
1 | webpackJsonp([2],{"2za1":function(e,s){},"7E45":function(e,s,n){"use strict";Object.defineProperty(s,"__esModule",{value:!0});var t=n("Xxa5"),i=n.n(t),a=n("exGp"),c=n.n(a),d=n("Z7ab"),o=n("qqiS"),r=n("gyMJ"),l={data:function(){return{tech:{name:"技术",childrenList:[{programmer:"程序员",name:"programmer",desc:"程序员"},{Python:"Python",name:"Python",desc:"Python"},{iDev:"iDev",name:"iDev",desc:"iDev"},{Android:"Android",name:"Android",desc:"Android"},{Linux:"Linux",name:"Linux",desc:"Linux"},{"node.js":"node.js",name:"nodejs",desc:"node.js"},{cloud:"云计算",name:"cloud",desc:"云计算"},{name:"bb",desc:"宽带症候群"}]},creative:{name:"创意",childrenList:[{desc:"分享创造",name:"create"},{desc:"设计",name:"design"},{desc:"奇思妙想",name:"ideas"}]},play:{name:"好玩",childrenList:[{desc:"分享发现",name:"share"},{desc:"游戏",name:"games"},{desc:"游戏",name:"games"},{desc:"电影",name:"movie"},{desc:"音乐",name:"music"}]},work:{name:"酷工作",childrenList:[{desc:"工作",name:"jobs"},{desc:"求职",name:"cv"},{desc:"职场话题",name:"career"}]},name:"",nodeListShow:!1,dataList:[]}},methods:{back:function(){this.nodeListShow=!1},refresh:function(){var e=this;return c()(i.a.mark(function s(){return i.a.wrap(function(s){for(;;)switch(s.prev=s.next){case 0:return s.next=2,e.fetchNodeDetail(e.name);case 2:e.$refs.listBase.scroll.finishPullDown();case 3:case"end":return s.stop()}},s,e)}))()},go:function(e){this.name=e.name,this.fetchNodeDetail(e.name),this.nodeListShow=!0},fetchNodeDetail:function(e){var s=this;return c()(i.a.mark(function n(){var t;return i.a.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return s.dataList=[],n.next=3,Object(r.c)({node_name:e});case 3:t=n.sent,s.dataList=t,s.$refs.listBase.refresh();case 6:case"end":return n.stop()}},n,s)}))()},listDetail:function(e){this.$router.push({path:"/nodes/"+e})}},components:{listBase:d.a,loading:o.a}},m={render:function(){var e=this,s=e.$createElement,n=e._self._c||s;return n("div",{staticClass:"node"},[n("div",{staticClass:"node-list"},[n("div",{staticClass:"node-item"},[n("div",{staticClass:"node-name"},[e._v(e._s(e.tech.name))]),e._v(" "),n("ul",{staticClass:"node-childList"},e._l(e.tech.childrenList,function(s,t){return n("li",{key:t,staticClass:"child-item",on:{click:function(n){e.go(s)}}},[e._v("\n "+e._s(s.desc)+"\n ")])}))]),e._v(" "),n("div",{staticClass:"node-item"},[n("div",{staticClass:"node-name"},[e._v(e._s(e.creative.name))]),e._v(" "),n("ul",{staticClass:"node-childList"},e._l(e.creative.childrenList,function(s,t){return n("li",{key:t,staticClass:"child-item",on:{click:function(n){e.go(s)}}},[e._v("\n "+e._s(s.desc)+"\n ")])}))]),e._v(" "),n("div",{staticClass:"node-item"},[n("div",{staticClass:"node-name"},[e._v(e._s(e.play.name))]),e._v(" "),n("ul",{staticClass:"node-childList"},e._l(e.play.childrenList,function(s,t){return n("li",{key:t,staticClass:"child-item",on:{click:function(n){e.go(s)}}},[e._v("\n "+e._s(s.desc)+"\n ")])}))]),e._v(" "),n("div",{staticClass:"node-item"},[n("div",{staticClass:"node-name"},[e._v(e._s(e.work.name))]),e._v(" "),n("ul",{staticClass:"node-childList"},e._l(e.work.childrenList,function(s,t){return n("li",{key:t,staticClass:"child-item",on:{click:function(n){e.go(s)}}},[e._v("\n "+e._s(s.desc)+"\n ")])}))])]),e._v(" "),n("transition",{attrs:{name:"fade"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.nodeListShow,expression:"nodeListShow"}],staticClass:"node-detail"},[n("div",{staticClass:"v-header"},[n("div",{staticClass:"icon-wrapper",on:{click:e.back}},[n("icon",{attrs:{name:"angle-left",scale:"1.5"}})],1),e._v("\n v2er\n ")]),e._v(" "),n("list-base",{ref:"listBase",attrs:{dataList:e.dataList},on:{pullDown:e.refresh,select:e.listDetail}}),e._v(" "),n("router-view")],1)])],1)},staticRenderFns:[]};var u=n("VU/8")(l,m,!1,function(e){n("2za1")},null,null);s.default=u.exports}});
2 | //# sourceMappingURL=2.418619809e7e438d6206.js.map
--------------------------------------------------------------------------------
/dist/static/js/2.418619809e7e438d6206.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["webpack:///src/components/nodes/nodeList.vue","webpack:///./src/components/nodes/nodeList.vue?50a4","webpack:///./src/components/nodes/nodeList.vue"],"names":["nodeList","Python","_this","this","name","finishPullDown","_this2","resp","refresh","id","listBase","list","loading","nodes_nodeList","render","_vm","_h","$createElement","_c","_self","staticClass","_v","_s","tech","_l","item","index","key","on","click","$event","go","desc","creative","play","work","attrs","directives","rawName","value","expression","back","scale","ref","dataList","pullDown","select","listDetail","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"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","file":"static/js/2.418619809e7e438d6206.js","sourcesContent":["\n \n
\n
\n
\n
{{creative.name}}
\n
\n
\n
\n
\n
\n
\n \n \n \n \n \n
\n \n
\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/nodes/nodeList.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"node\"},[_c('div',{staticClass:\"node-list\"},[_c('div',{staticClass:\"node-item\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.tech.name))]),_vm._v(\" \"),_c('ul',{staticClass:\"node-childList\"},_vm._l((_vm.tech.childrenList),function(item,index){return _c('li',{key:index,staticClass:\"child-item\",on:{\"click\":function($event){_vm.go(item)}}},[_vm._v(\"\\n \"+_vm._s(item.desc)+\"\\n \")])}))]),_vm._v(\" \"),_c('div',{staticClass:\"node-item\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.creative.name))]),_vm._v(\" \"),_c('ul',{staticClass:\"node-childList\"},_vm._l((_vm.creative.childrenList),function(item,index){return _c('li',{key:index,staticClass:\"child-item\",on:{\"click\":function($event){_vm.go(item)}}},[_vm._v(\"\\n \"+_vm._s(item.desc)+\"\\n \")])}))]),_vm._v(\" \"),_c('div',{staticClass:\"node-item\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.play.name))]),_vm._v(\" \"),_c('ul',{staticClass:\"node-childList\"},_vm._l((_vm.play.childrenList),function(item,index){return _c('li',{key:index,staticClass:\"child-item\",on:{\"click\":function($event){_vm.go(item)}}},[_vm._v(\"\\n \"+_vm._s(item.desc)+\"\\n \")])}))]),_vm._v(\" \"),_c('div',{staticClass:\"node-item\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.work.name))]),_vm._v(\" \"),_c('ul',{staticClass:\"node-childList\"},_vm._l((_vm.work.childrenList),function(item,index){return _c('li',{key:index,staticClass:\"child-item\",on:{\"click\":function($event){_vm.go(item)}}},[_vm._v(\"\\n \"+_vm._s(item.desc)+\"\\n \")])}))])]),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"fade\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.nodeListShow),expression:\"nodeListShow\"}],staticClass:\"node-detail\"},[_c('div',{staticClass:\"v-header\"},[_c('div',{staticClass:\"icon-wrapper\",on:{\"click\":_vm.back}},[_c('icon',{attrs:{\"name\":\"angle-left\",\"scale\":\"1.5\"}})],1),_vm._v(\"\\n v2er\\n \")]),_vm._v(\" \"),_c('list-base',{ref:\"listBase\",attrs:{\"dataList\":_vm.dataList},on:{\"pullDown\":_vm.refresh,\"select\":_vm.listDetail}}),_vm._v(\" \"),_c('router-view')],1)])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4d9911c0\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/nodes/nodeList.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-4d9911c0\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!stylus-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./nodeList.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./nodeList.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./nodeList.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4d9911c0\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./nodeList.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/nodes/nodeList.vue\n// module id = null\n// module chunks = "],"sourceRoot":""}
--------------------------------------------------------------------------------
/dist/static/js/3.811c14d3fc363f56f053.js:
--------------------------------------------------------------------------------
1 | webpackJsonp([3],{UXSY:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var s=n("Xxa5"),r=n.n(s),a=n("exGp"),i=n.n(a),o=n("Z7ab"),c=n("qqiS"),u=n("gyMJ"),f={data:function(){return{dataList:[],isLoad:!0}},mounted:function(){this.fetchList()},methods:{listDetail:function(t){this.$router.push({path:"/now/"+t})},refresh:function(){var t=this;return i()(r.a.mark(function e(){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.fetchList();case 2:t.$refs.listBase.scroll.finishPullDown();case 3:case"end":return e.stop()}},e,t)}))()},fetchList:function(){var t=this;return i()(r.a.mark(function e(){var n;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(u.d)();case 2:n=e.sent,t.dataList=n,t.$refs.listBase.refresh();case 5:case"end":return e.stop()}},e,t)}))()},debounce:function(t,e){var n=void 0;return function(){for(var s=this,r=arguments.length,a=Array(r),i=0;i\n \n \n \n \n
\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/now/now.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"now\",staticClass:\"now\"},[_c('list-base',{ref:\"listBase\",attrs:{\"dataList\":_vm.dataList},on:{\"pullDown\":_vm.refresh,\"select\":_vm.listDetail}}),_vm._v(\" \"),_c('router-view')],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-2654814e\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/now/now.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-2654814e\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!stylus-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./now.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./now.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./now.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2654814e\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./now.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/now/now.vue\n// module id = null\n// module chunks = "],"sourceRoot":""}
--------------------------------------------------------------------------------
/dist/static/js/4.d12b786ae98a68fdb5f0.js:
--------------------------------------------------------------------------------
1 | webpackJsonp([4],{"3GUi":function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=a("woOf"),r=a.n(s),i=a("Xxa5"),n=a.n(i),l=a("exGp"),c=a.n(l),d=a("qqiS"),o=a("bh5B"),v=a("gyMJ"),u={created:function(){this.fetchHeader(),this.fetchReply()},data:function(){return{detail:{},ready:!1,replyReady:!1,replyList:[],page_size:100,page:1}},computed:{timerline:function(){var e=parseInt(this.detail.created+"000",10),t=(Date.now()-e)/1e3;return t<60?Math.round(Math.max(t,1))+"秒前":t>60&&t<36e3?Math.round(t/60)+"分钟前":Math.round(t/60/60)+"小时前"}},methods:{back:function(){this.$router.go(-1)},fetchReply:function(){var e=this;return c()(n.a.mark(function t(){var a;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e.replyReady=!0,t.next=3,Object(v.b)({topic_id:e.$route.params.id,page_size:e.page_size,page:e.page});case 3:a=t.sent,e.replyList=a,e.$refs.content.scroll.refresh(),e.replyReady=!1;case 7:case"end":return t.stop()}},t,e)}))()},fetchHeader:function(){var e=this;return c()(n.a.mark(function t(){var a;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e.ready=!0,t.next=3,Object(v.c)({id:e.$route.params.id});case 3:a=t.sent,e.detail=r()({},a[0]),e.ready=!1;case 6:case"end":return t.stop()}},t,e)}))()}},filters:{normalizeTime:function(e){var t=parseInt(e+"000",10),a=new Date(t);return a.getFullYear()+"-"+((a.getMonth()+1<10?"0"+(a.getMonth()+1):a.getMonth()+1)+"-")+(a.getDate()<10?"0"+a.getDate():a.getDate())}},components:{loading:d.a,scroller:o.a}},m={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("transition",{attrs:{name:"slider"}},[a("div",{staticClass:"list-detail",on:{click:function(e){e.stopPropagation()},touch:function(e){e.stopPropagation()}}},[a("div",{staticClass:"detail-header border-1px-b"},[a("div",{staticClass:"icon-wrapper",on:{click:e.back}},[a("icon",{attrs:{name:"angle-left",scale:"1.5"}})],1)]),e._v(" "),a("loading",{directives:[{name:"show",rawName:"v-show",value:e.ready,expression:"ready"}]}),e._v(" "),a("scroller",{directives:[{name:"show",rawName:"v-show",value:!e.ready,expression:"!ready"}],ref:"content",staticClass:"content-wrapper"},[a("div",[a("div",{staticClass:"detail-title"},[e._v("\n "+e._s(e.detail.title)+"\n ")]),e._v(" "),a("div",{staticClass:"detail-user"},[a("img",{staticClass:"user-avatar",attrs:{src:e.detail.member?e.detail.member.avatar_normal:""}}),e._v(" "),a("div",{staticClass:"user-info"},[a("div",{staticClass:"user-name"},[e._v(e._s(e.detail.member?e.detail.member.username:""))]),e._v(" "),a("div",{staticClass:"user-node"},[a("div",{staticClass:"node-name"},[e._v(e._s(e.detail.node?e.detail.node.title:""))]),e._v(" "),a("div",{staticClass:"user-divid"},[e._v("|")]),e._v(" "),a("div",{staticClass:"user-created"},[e._v(e._s(e.timerline))])])])]),e._v(" "),a("div",{staticClass:"detail-content border-1px-b",domProps:{innerHTML:e._s(e.detail.content_rendered)}}),e._v(" "),a("div",{staticClass:"detail-reply"},[a("loading",{directives:[{name:"show",rawName:"v-show",value:e.replyReady,expression:"replyReady"}]}),e._v(" "),a("ul",e._l(e.replyList,function(t,s){return a("li",{key:s,staticClass:"reply-item border-1px-b"},[a("div",{staticClass:"detail-user"},[a("img",{directives:[{name:"lazy",rawName:"v-lazy",value:t.member?t.member.avatar_large:"",expression:"item.member ? item.member.avatar_large : ''"}],staticClass:"user-avatar"}),e._v(" "),a("div",{staticClass:"user-info"},[a("div",{staticClass:"user-name"},[e._v(e._s(t.member?t.member.username:""))]),e._v(" "),a("div",{staticClass:"user-node"},[a("div",{staticClass:"node-name"},[e._v("第"+e._s(s+1)+"楼")]),e._v(" "),a("div",{staticClass:"user-divid"},[e._v("|")]),e._v(" "),a("div",{staticClass:"user-created"},[e._v(e._s(e._f("normalizeTime")(t.created)))])])])]),e._v(" "),a("div",{staticClass:"reply-content",domProps:{innerHTML:e._s(t.content_rendered)}}),e._v(" "),a("div",{directives:[{name:"show",rawName:"v-show",value:t.thanks>0,expression:"item.thanks > 0"}],staticClass:"icon-heart"},[a("icon",{attrs:{name:"heart",scale:"0.8"}}),e._v(" "),a("span",{staticClass:"heart-count"},[e._v(e._s(t.thanks))])],1)])}))],1)])])],1)])},staticRenderFns:[]};var p=a("VU/8")(u,m,!1,function(e){a("z9QQ")},null,null);t.default=p.exports},z9QQ:function(e,t){}});
2 | //# sourceMappingURL=4.d12b786ae98a68fdb5f0.js.map
--------------------------------------------------------------------------------
/dist/static/js/4.d12b786ae98a68fdb5f0.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["webpack:///src/components/listDetail/listDetail.vue","webpack:///./src/components/listDetail/listDetail.vue?25a5","webpack:///./src/components/listDetail/listDetail.vue"],"names":["listDetail","fetchHeader","fetchReply","_this","this","id","page_size","page","resp","refresh","_this2","_time","getDate","loading","scroller","scroll_scroll","listDetail_listDetail","render","_vm","_h","$createElement","_c","_self","attrs","name","staticClass","on","click","$event","stopPropagation","touch","back","scale","_v","directives","rawName","value","expression","ready","ref","_s","detail","title","src","member","avatar_normal","username","node","timerline","domProps","innerHTML","content_rendered","_l","item","index","key","avatar_large","_f","created","thanks","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"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","file":"static/js/4.d12b786ae98a68fdb5f0.js","sourcesContent":["\n \n \n \n
\n
\n \n
\n {{detail.title}}\n
\n
\n
![]()
\n
\n
{{detail.member ? detail.member.username : ''}}
\n
\n
{{detail.node ? detail.node.title : ''}}
\n
|
\n
{{timerline}}
\n
\n
\n
\n
\n
\n
\n
\n \n
\n \n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/listDetail/listDetail.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slider\"}},[_c('div',{staticClass:\"list-detail\",on:{\"click\":function($event){$event.stopPropagation();},\"touch\":function($event){$event.stopPropagation();}}},[_c('div',{staticClass:\"detail-header border-1px-b\"},[_c('div',{staticClass:\"icon-wrapper\",on:{\"click\":_vm.back}},[_c('icon',{attrs:{\"name\":\"angle-left\",\"scale\":\"1.5\"}})],1)]),_vm._v(\" \"),_c('loading',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.ready),expression:\"ready\"}]}),_vm._v(\" \"),_c('scroller',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.ready),expression:\"!ready\"}],ref:\"content\",staticClass:\"content-wrapper\"},[_c('div',[_c('div',{staticClass:\"detail-title\"},[_vm._v(\"\\n \"+_vm._s(_vm.detail.title)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"detail-user\"},[_c('img',{staticClass:\"user-avatar\",attrs:{\"src\":_vm.detail.member ? _vm.detail.member.avatar_normal : ''}}),_vm._v(\" \"),_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"user-name\"},[_vm._v(_vm._s(_vm.detail.member ? _vm.detail.member.username : ''))]),_vm._v(\" \"),_c('div',{staticClass:\"user-node\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.detail.node ? _vm.detail.node.title : ''))]),_vm._v(\" \"),_c('div',{staticClass:\"user-divid\"},[_vm._v(\"|\")]),_vm._v(\" \"),_c('div',{staticClass:\"user-created\"},[_vm._v(_vm._s(_vm.timerline))])])])]),_vm._v(\" \"),_c('div',{staticClass:\"detail-content border-1px-b\",domProps:{\"innerHTML\":_vm._s(_vm.detail.content_rendered)}}),_vm._v(\" \"),_c('div',{staticClass:\"detail-reply\"},[_c('loading',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.replyReady),expression:\"replyReady\"}]}),_vm._v(\" \"),_c('ul',_vm._l((_vm.replyList),function(item,index){return _c('li',{key:index,staticClass:\"reply-item border-1px-b\"},[_c('div',{staticClass:\"detail-user\"},[_c('img',{directives:[{name:\"lazy\",rawName:\"v-lazy\",value:(item.member ? item.member.avatar_large : ''),expression:\"item.member ? item.member.avatar_large : ''\"}],staticClass:\"user-avatar\"}),_vm._v(\" \"),_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"user-name\"},[_vm._v(_vm._s(item.member ? item.member.username : ''))]),_vm._v(\" \"),_c('div',{staticClass:\"user-node\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(\"第\"+_vm._s(index+1)+\"楼\")]),_vm._v(\" \"),_c('div',{staticClass:\"user-divid\"},[_vm._v(\"|\")]),_vm._v(\" \"),_c('div',{staticClass:\"user-created\"},[_vm._v(_vm._s(_vm._f(\"normalizeTime\")(item.created)))])])])]),_vm._v(\" \"),_c('div',{staticClass:\"reply-content\",domProps:{\"innerHTML\":_vm._s(item.content_rendered)}}),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(item.thanks > 0),expression:\"item.thanks > 0\"}],staticClass:\"icon-heart\"},[_c('icon',{attrs:{\"name\":\"heart\",\"scale\":\"0.8\"}}),_vm._v(\" \"),_c('span',{staticClass:\"heart-count\"},[_vm._v(_vm._s(item.thanks))])],1)])}))],1)])])],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1abd3ba8\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/listDetail/listDetail.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1abd3ba8\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!stylus-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./listDetail.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./listDetail.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./listDetail.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1abd3ba8\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./listDetail.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/listDetail/listDetail.vue\n// module id = null\n// module chunks = "],"sourceRoot":""}
--------------------------------------------------------------------------------
/dist/static/js/app.dc8137b45381d871d00a.js:
--------------------------------------------------------------------------------
1 | webpackJsonp([6],{"0HFF":function(t,n){},"34KM":function(t,n){},"5AqT":function(t,n){},"7Otq":function(t,n){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTk2QkI4RkE3NjE2MTFFNUE4NEU4RkIxNjQ5MTYyRDgiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTk2QkI4Rjk3NjE2MTFFNUE4NEU4RkIxNjQ5MTYyRDgiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NjU2QTEyNzk3NjkyMTFFMzkxODk4RDkwQkY4Q0U0NzYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjU2QTEyN0E3NjkyMTFFMzkxODk4RDkwQkY4Q0U0NzYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5WHowqAAAXNElEQVR42uxda4xd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"},Cvds:function(t,n){},D4uH:function(t,n,e){"use strict";var i={},r={name:"icon",props:{name:{type:String,validator:function(t){return t?t in i||(console.warn('Invalid prop: prop "name" is referring to an unregistered icon "'+t+'".\nPlease make sure you have imported this icon before using it.'),!1):(console.warn('Invalid prop: prop "name" is required.'),!1)}},scale:[Number,String],spin:Boolean,inverse:Boolean,pulse:Boolean,flip:{validator:function(t){return"horizontal"===t||"vertical"===t}},label:String},data:function(){return{x:!1,y:!1,childrenWidth:0,childrenHeight:0,outerScale:1}},computed:{normalizedScale:function(){var t=this.scale;return t=void 0===t?1:Number(t),isNaN(t)||t<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.',this),this.outerScale):t*this.outerScale},klass:function(){return{"fa-icon":!0,"fa-spin":this.spin,"fa-flip-horizontal":"horizontal"===this.flip,"fa-flip-vertical":"vertical"===this.flip,"fa-inverse":this.inverse,"fa-pulse":this.pulse}},icon:function(){return this.name?i[this.name]:null},box:function(){return this.icon?"0 0 "+this.icon.width+" "+this.icon.height:"0 0 "+this.width+" "+this.height},ratio:function(){if(!this.icon)return 1;var t=this.icon,n=t.width,e=t.height;return Math.max(n,e)/16},width:function(){return this.childrenWidth||this.icon&&this.icon.width/this.ratio*this.normalizedScale||0},height:function(){return this.childrenHeight||this.icon&&this.icon.height/this.ratio*this.normalizedScale||0},style:function(){return 1!==this.normalizedScale&&{fontSize:this.normalizedScale+"em"}},raw:function(){if(!this.icon||!this.icon.raw)return null;var t=this.icon.raw,n={};return t=t.replace(/\s(?:xml:)?id=(["']?)([^"')\s]+)\1/g,function(t,e,i){var r="fa-"+(a++).toString(16);return n[i]=r,' id="'+r+'"'}),t=t.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,function(t,e,i,r){var a=e||r;return a&&n[a]?"#"+n[a]:t}),t}},mounted:function(){var t=this;if(!this.icon){this.$children.forEach(function(n){n.outerScale=t.normalizedScale});var n=0,e=0;this.$children.forEach(function(t){n=Math.max(n,t.width),e=Math.max(e,t.height)}),this.childrenWidth=n,this.childrenHeight=e,this.$children.forEach(function(t){t.x=(n-t.width)/2,t.y=(e-t.height)/2})}},register:function(t){for(var n in t){var e=t[n];e.paths||(e.paths=[]),e.d&&e.paths.push({d:e.d}),e.polygons||(e.polygons=[]),e.points&&e.polygons.push({points:e.points}),i[n]=e}},icons:i},a=870711;var o={render:function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("svg",{class:t.klass,style:t.style,attrs:{version:"1.1",role:t.label?"img":"presentation","aria-label":t.label,x:t.x,y:t.y,width:t.width,height:t.height,viewBox:t.box}},[t._t("default",[t.icon&&t.icon.paths?t._l(t.icon.paths,function(n,i){return e("path",t._b({key:"path-"+i},"path",n,!1))}):t._e(),t._v(" "),t.icon&&t.icon.polygons?t._l(t.icon.polygons,function(n,i){return e("polygon",t._b({key:"polygon-"+i},"polygon",n,!1))}):t._e(),t._v(" "),t.icon&&t.icon.raw?[e("g",{domProps:{innerHTML:t._s(t.raw)}})]:t._e()])],2)},staticRenderFns:[]};var s=e("VU/8")(r,o,!1,function(t){e("5AqT")},null,null);n.a=s.exports},NHnr:function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var i=e("7+uW"),r={render:function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"footer border-1px"},[e("div",{staticClass:"example"}),t._v(" "),e("router-link",{staticClass:"footer-item",attrs:{to:"/hot",tag:"div"}},[e("icon",{attrs:{name:"fire",scale:"1.5"}}),t._v(" "),e("span",[t._v("最热")])],1),t._v(" "),e("router-link",{staticClass:"footer-item",attrs:{to:"/now",tag:"div"}},[e("icon",{attrs:{name:"clock-o",scale:"1.5"}}),t._v(" "),e("span",[t._v("最新")])],1),t._v(" "),e("router-link",{staticClass:"footer-item",attrs:{to:"/nodes",tag:"div"}},[e("icon",{attrs:{name:"location-arrow",scale:"1.5"}}),t._v(" "),e("span",[t._v("节点")])],1)],1)},staticRenderFns:[]};var a={name:"App",components:{"v-footer":e("VU/8")({data:function(){return{icons:["fire","clock-o","location-arrow"]}}},r,!1,function(t){e("fFT8")},null,null).exports}},o={render:function(){var t=this.$createElement,n=this._self._c||t;return n("div",{staticClass:"main"},[n("keep-alive",[n("router-view")],1),this._v(" "),n("v-footer")],1)},staticRenderFns:[]};var s=e("VU/8")(a,o,!1,function(t){e("0HFF")},null,null).exports,c=e("/ocq"),l=function(){return Promise.all([e.e(0),e.e(4)]).then(e.bind(null,"3GUi"))};i.a.use(c.a);var u=new c.a({mode:"history",routes:[{path:"/",redirect:"/now"},{path:"/now",name:"最新",component:function(){return Promise.all([e.e(0),e.e(3)]).then(e.bind(null,"UXSY"))},children:[{path:":id",component:l}]},{path:"/hot",name:"最热",component:function(){return Promise.all([e.e(0),e.e(1)]).then(e.bind(null,"zI3V"))},children:[{path:":id",component:l}]},{path:"/nodes",name:"节点",component:function(){return Promise.all([e.e(0),e.e(2)]).then(e.bind(null,"7E45"))},children:[{path:":id",component:l}]}]}),h=e("cTzj"),d=e.n(h),f=(e("34KM"),e("Cvds"),e("D/PP"),e("D4uH")),m=e("v5o6"),p=e.n(m),v=e("Xxa5"),g=e.n(v),I=e("exGp"),w=e.n(I),y=e("gyMJ"),C={name:"userDetail",data:function(){return{avatar:"",name:"",show:!1,closed:!1,onClose:null,url:"",createTime:"",ready:!1}},created:function(){this.fetchUserInfo()},watch:{closed:{deep:!0,handler:function(t){t&&(this.show=!1,this.$el.addEventListener("transitionend",this.destroyElement))}}},methods:{close:function(){this.closed=!0,"function"==typeof this.onClose&&this.onClose(this)},destroyElement:function(){this.$el.removeEventListener("transitionend",this.destroyElement),this.$destroy(!0),this.$el.parentNode.removeChild(this.$el)},fetchUserInfo:function(){var t=this;return w()(g.a.mark(function n(){var e;return g.a.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return t.ready=!1,n.next=3,Object(y.e)({username:t.name});case 3:e=n.sent,t.avatar=e.avatar_large,t.createTime=e.created,t.url=e.url,t.ready=!0;case 8:case"end":return n.stop()}},n,t)}))()}},filters:{normalizeTime:function(t){var n=parseInt(t+"000",10),e=new Date(n);return e.getFullYear()+"-"+((e.getMonth()+1<10?"0"+(e.getMonth()+1):e.getMonth()+1)+"-")+(e.getDate()<10?"0"+e.getDate():e.getDate())}}},b={render:function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("transition",{attrs:{name:"open"}},[e("div",{directives:[{name:"show",rawName:"v-show",value:t.show,expression:"show"}],staticClass:"user-wrapper"},[e("div",{staticClass:"user-close",on:{click:t.close}},[e("icon",{attrs:{name:"times",scale:"1.5"}})],1),t._v(" "),e("div",{directives:[{name:"show",rawName:"v-show",value:t.ready,expression:"ready"}],staticClass:"user-inner"},[e("img",{staticClass:"user-avatar",attrs:{src:t.avatar}}),t._v(" "),e("div",{staticClass:"user-time"},[t._v(t._s(t.name))]),t._v(" "),e("div",{staticClass:"user-time"},[t._v("加入时间:"+t._s(t._f("normalizeTime")(t.createTime)))]),t._v(" "),e("div",{staticClass:"user-time"},[t._v("url: "+t._s(t.url))]),t._v(" "),e("ul",{staticClass:"user-info"},[e("li",{staticClass:"info-tei"},[e("span",{staticClass:"info-name"}),t._v(" "),e("span",{staticClass:"info-desc"})])])])])])},staticRenderFns:[]};var k=e("VU/8")(C,b,!1,function(t){e("oir+")},null,null).exports,R=i.a.extend(k),E=void 0,z=[],W=1;function N(t){"string"==typeof(t=t||{})&&(t={name:t});var n="user_"+W++;(E=new R({data:t})).id=n,E.vm=E.$mount(),document.body.appendChild(E.vm.$el),E.vm.show=!0,z.push(E)}var U=function(t){t.prototype.$user=N};e("cI2h");i.a.component("icon",f.a),p.a.attach(document.body),i.a.use(U),i.a.use(d.a,{loading:e("7Otq")}),i.a.config.productionTip=!1,new i.a({el:"#app",router:u,components:{App:s},render:function(t){return t(s)}})},cI2h:function(t,n){!function(t,n){function e(){var i=t.innerWidth;i>t.screen.width?t.requestAnimationFrame(e):(i>720&&(i=720),n.documentElement.style.fontSize=1e4/750+"vw",n.body.style.opacity=1)}"loading"!==n.readyState?e():n.addEventListener("DOMContentLoaded",e),t.addEventListener("resize",e)}(window,document)},fFT8:function(t,n){},gyMJ:function(t,n,e){"use strict";var i=e("//Fk"),r=e.n(i),a=e("woOf"),o=e.n(a),s=e("mtWM"),c=e.n(s),l=(e("mw3O"),c.a.create({baseURL:"/api",timeout:18e4})),u=function(t,n,e){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=o()({},i,{url:n,method:t,data:e});return a.headers=a.headers||{},new r.a(function(t,n){l.request(a).then(function(n){var e=n.data;200===n.status&&t(e),t(e)}).catch(function(t){n(t)})})},h=function(t,n){return u("get",t,null,n)};e.d(n,"a",function(){return d}),e.d(n,"d",function(){return f}),e.d(n,"e",function(){return m}),e.d(n,"c",function(){return p}),e.d(n,"b",function(){return v});var d=function(){return h("/topics/hot.json")},f=function(){return h("/topics/latest.json")},m=function(t){return h("/members/show.json",{params:t})},p=function(t){return h("/topics/show.json",{params:t})},v=function(t){return h("/replies/show.json",{params:t})}},"oir+":function(t,n){}},["NHnr"]);
2 | //# sourceMappingURL=app.dc8137b45381d871d00a.js.map
--------------------------------------------------------------------------------
/dist/static/js/manifest.4276fa394328a9f55052.js:
--------------------------------------------------------------------------------
1 | !function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,a,c){for(var i,u,f,s=0,l=[];s
2 |
3 |
4 |
5 |
7 | v2ex-vue
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/index.template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 666
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "experimentalDecorators": true
4 | }
5 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "v2ex-vue",
3 | "version": "1.0.0",
4 | "description": "A Vue.js project",
5 | "author": "zouhang <1102639563@qq.com>",
6 | "private": true,
7 | "scripts": {
8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
9 | "start": "node server.js",
10 | "lint": "eslint --ext .js,.vue src --fix",
11 | "build": "node build/build.js"
12 | },
13 | "dependencies": {
14 | "axios": "^0.18.0",
15 | "better-scroll": "^1.12.4",
16 | "connect-history-api-fallback": "^1.5.0",
17 | "cssnano": "^3.10.0",
18 | "express": "^4.16.2",
19 | "fastclick": "^1.0.6",
20 | "mand-mobile": "^1.3.3",
21 | "postcss-aspect-ratio-mini": "0.0.2",
22 | "postcss-cssnext": "^3.1.0",
23 | "postcss-px-to-viewport": "0.0.3",
24 | "postcss-viewport-units": "^0.1.3",
25 | "postcss-write-svg": "^3.0.1",
26 | "vue": "^2.5.16",
27 | "vue-awesome": "^2.3.5",
28 | "vue-lazyload": "^1.2.1",
29 | "vue-router": "^3.0.1",
30 | "vue-server-renderer": "^2.5.16"
31 | },
32 | "devDependencies": {
33 | "autoprefixer": "^7.1.2",
34 | "babel-core": "^6.22.1",
35 | "babel-eslint": "^8.2.1",
36 | "babel-helper-vue-jsx-merge-props": "^2.0.3",
37 | "babel-loader": "^7.1.1",
38 | "babel-plugin-syntax-jsx": "^6.18.0",
39 | "babel-plugin-transform-runtime": "^6.22.0",
40 | "babel-plugin-transform-vue-jsx": "^3.5.0",
41 | "babel-preset-env": "^1.3.2",
42 | "babel-preset-stage-2": "^6.22.0",
43 | "chalk": "^2.0.1",
44 | "copy-webpack-plugin": "^4.0.1",
45 | "css-loader": "^0.28.0",
46 | "eslint": "^4.15.0",
47 | "eslint-config-standard": "^10.2.1",
48 | "eslint-config-vue": "^2.0.2",
49 | "eslint-friendly-formatter": "^3.0.0",
50 | "eslint-loader": "^1.7.1",
51 | "eslint-plugin-html": "^4.0.2",
52 | "eslint-plugin-import": "^2.7.0",
53 | "eslint-plugin-node": "^5.2.0",
54 | "eslint-plugin-promise": "^3.4.0",
55 | "eslint-plugin-standard": "^3.0.1",
56 | "eslint-plugin-vue": "^4.0.0",
57 | "extract-text-webpack-plugin": "^3.0.0",
58 | "file-loader": "^1.1.4",
59 | "friendly-errors-webpack-plugin": "^1.6.1",
60 | "html-webpack-plugin": "^2.30.1",
61 | "node-notifier": "^5.1.2",
62 | "optimize-css-assets-webpack-plugin": "^3.2.0",
63 | "ora": "^1.2.0",
64 | "portfinder": "^1.0.13",
65 | "postcss-import": "^11.0.0",
66 | "postcss-loader": "^2.0.8",
67 | "postcss-pxtorem": "^4.0.1",
68 | "postcss-url": "^7.2.1",
69 | "prerender-spa-plugin": "^3.1.0",
70 | "rimraf": "^2.6.0",
71 | "semver": "^5.3.0",
72 | "shelljs": "^0.7.6",
73 | "stylus": "^0.54.5",
74 | "stylus-loader": "^3.0.2",
75 | "uglifyjs-webpack-plugin": "^1.1.1",
76 | "url-loader": "^0.5.8",
77 | "vue-loader": "^13.3.0",
78 | "vue-style-loader": "^3.0.1",
79 | "vue-template-compiler": "^2.5.16",
80 | "webpack": "^3.6.0",
81 | "webpack-bundle-analyzer": "^2.9.0",
82 | "webpack-dev-server": "^2.9.1",
83 | "webpack-merge": "^4.1.0"
84 | },
85 | "engines": {
86 | "node": ">= 6.0.0",
87 | "npm": ">= 3.0.0"
88 | },
89 | "browserslist": [
90 | "> 1%",
91 | "last 2 versions",
92 | "not ie <= 8"
93 | ]
94 | }
95 |
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | const path = require('path')
3 | const axios = require('axios')
4 | const app = express()
5 | const history = require('connect-history-api-fallback')
6 | // 引入第三方路由
7 | const proxyConf = require('./config/proxy')
8 | const headerConf = {
9 | // referer: 'https://www.v2ex.com',
10 | // host: 'www.v2ex.com'
11 | }
12 |
13 | let apiRoutes = express.Router()
14 |
15 | for (let k in proxyConf) {
16 | app.get(k, function(req, res) {
17 | // console.log(proxyConf[k])
18 | axios.get(proxyConf[k], {
19 | headers: headerConf,
20 | params: req.query
21 | }).then(response => {
22 | res.setHeader('Access-Control-Allow-Origin', '*')
23 | res.json(response.data)
24 | }).catch(e => {
25 | console.log(e)
26 | })
27 | })
28 | }
29 | app.use(history())
30 | app.use('/', apiRoutes)
31 | app.use(express.static(path.join(__dirname, 'dist')))
32 |
33 | const port = process.env.PORT || 5000
34 | app.listen(port)
35 | console.log('server started ' + port)
36 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
19 |
20 |
32 |
--------------------------------------------------------------------------------
/src/api/ajax.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios'
2 | import qs from 'qs'
3 |
4 | const service = axios.create({
5 | baseURL: process.env.MOCK_URL,
6 | timeout: 180000
7 | })
8 |
9 | /**
10 | * 通用request封装
11 | * @param method
12 | * @param url
13 | * @param data
14 | * @param config
15 | * @returns {Promise}
16 | */
17 | const request = (method, url, data, config = {}) => {
18 | const options = Object.assign({}, config, {
19 | url,
20 | method,
21 | data
22 | })
23 | options.headers = options.headers || {}
24 | return new Promise((resolve, reject) => {
25 | service.request(options)
26 | .then(res => {
27 | const data = res.data
28 | const status = res.status
29 | if (status === 200) {
30 | resolve(data)
31 | }
32 | // if (data.HasError) {
33 | // reject(data)
34 | // }
35 | resolve(data)
36 | }).catch(res => {
37 | reject(res)
38 | })
39 | })
40 | }
41 |
42 | export const ajax = {
43 | get(url, config) {
44 | return request('get', url, null, config)
45 | },
46 | delete(url, data, config) {
47 | return request('delete', url, data, config)
48 | },
49 | head(url, config) {
50 | return request('head', url, null, config)
51 | },
52 | post(url, data, config = {}) {
53 | if (!config.headers) {
54 | config.headers = {
55 | 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
56 | }
57 | }
58 | return request('post', url, qs.stringify(data), config)
59 | },
60 | put(url, data, config = {}) {
61 | config.headers = {
62 | 'Content-Type': 'application/json; charset=UTF-8'
63 | }
64 | return request('put', url, data, config)
65 | },
66 | patch(url, data, config) {
67 | return request('path', url, qs.stringify(data), config)
68 | },
69 | setCommonHeader(key, value) {
70 | service.defaults.headers.common[key] = value
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/src/api/index.js:
--------------------------------------------------------------------------------
1 | import { ajax } from './ajax'
2 |
3 | //最热主题
4 | export const getHotList = () => ajax.get('/topics/hot.json')
5 |
6 | //最新主题
7 | export const getNowList = () => ajax.get('/topics/latest.json')
8 |
9 | //节点信息
10 | export const getNodesList = ops => ajax.get(`/nodes/show.json?name=${ops}`)
11 |
12 | //用户主页
13 | export const getUserInfo = ops => ajax.get('/members/show.json', { params: ops })
14 |
15 | //帖子内容
16 | export const getListHeader = ops => ajax.get('/topics/show.json', { params: ops })
17 |
18 | //帖子回复详情
19 | export const getListDetail = ops => ajax.get('/replies/show.json', { params: ops })
20 |
--------------------------------------------------------------------------------
/src/assets/chat.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/src/assets/logo.png
--------------------------------------------------------------------------------
/src/common/css/border.css:
--------------------------------------------------------------------------------
1 | /* @svg 1px-border {
2 | height: 2px;
3 | @rect {
4 | fill: var(--color, black);
5 | width: 100%;
6 | height: 50%;
7 | }
8 | } */
9 |
10 | .border-1px {
11 | border-top: 1px solid #eee;
12 | /* border-image: svg(1px-border param(--color #eee)) 2 2 stretch; */
13 | }
14 |
15 | .border-1px-b {
16 | border-bottom: 1px solid #eee;
17 | /* border-image: svg(1px-border param(--color #eee)) 2 2 stretch; */
18 | }
--------------------------------------------------------------------------------
/src/common/stylus/base.styl:
--------------------------------------------------------------------------------
1 | @import "variable.styl"
2 |
3 | body, html
4 | line-height: 1
5 | font-family: 'PingFang SC', 'STHeitiSC-Light', 'Helvetica-Light', arial, sans-serif, 'Droid Sans Fallback'
6 | user-select: none
7 | -webkit-tap-highlight-color: transparent
8 | background: $color-background
9 | color: $color-text
10 | *, *:before, *:after
11 | box-sizing border-box
12 | img
13 | content: normal !important
14 |
15 | @media (-webkit-min-device-pixel-ratio: 1.5),(min-device-pixel-ratio: 1.5)
16 | .border-1px
17 | &::after
18 | -webkit-transform: scaleY(0.7)
19 | transform: scaleY(0.7)
20 |
21 | @media (-webkit-min-device-pixel-ratio: 2),(min-device-pixel-ratio: 2)
22 | .border-1px
23 | &::after
24 | -webkit-transform: scaleY(0.5)
25 | transform: scaleY(0.5)
--------------------------------------------------------------------------------
/src/common/stylus/index.styl:
--------------------------------------------------------------------------------
1 | @import "./reset.styl"
2 | @import "./base.styl"
--------------------------------------------------------------------------------
/src/common/stylus/mixin.styl:
--------------------------------------------------------------------------------
1 | // 背景图片
2 | bg-image($url)
3 | background-image: url($url + "@2x.png")
4 | @media (-webkit-min-device-pixel-ratio: 3),(min-device-pixel-ratio: 3)
5 | background-image: url($url + "@3x.png")
6 |
7 | // 不换行
8 | no-wrap()
9 | text-overflow: ellipsis
10 | overflow: hidden
11 | white-space: nowrap
12 |
13 | // 扩展点击区域
14 | extend-click()
15 | position: relative
16 | &:before
17 | content: ''
18 | position: absolute
19 | top: -10px
20 | left: -10px
21 | right: -10px
22 | bottom: -10px
--------------------------------------------------------------------------------
/src/common/stylus/reset.styl:
--------------------------------------------------------------------------------
1 | /**
2 | * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/)
3 | * http://cssreset.com
4 | */
5 | html, body, div, span, applet, object, iframe,
6 | h1, h2, h3, h4, h5, h6, p, blockquote, pre,
7 | a, abbr, acronym, address, big, cite, code,
8 | del, dfn, em, img, ins, kbd, q, s, samp,
9 | small, strike, strong, sub, sup, tt, var,
10 | b, u, i, center,
11 | dl, dt, dd, ol, ul, li,
12 | fieldset, form, label, legend,
13 | table, caption, tbody, tfoot, thead, tr, th, td,
14 | article, aside, canvas, details, embed,
15 | figure, figcaption, footer, header,
16 | menu, nav, output, ruby, section, summary,
17 | time, mark, audio, video, input
18 | margin: 0
19 | padding: 0
20 | border: 0
21 | font-size: 100%
22 | font-weight: normal
23 | vertical-align: baseline
24 |
25 | /* HTML5 display-role reset for older browsers */
26 | article, aside, details, figcaption, figure,
27 | footer, header, menu, nav, section
28 | display: block
29 |
30 | body
31 | line-height: 1
32 |
33 | blockquote, q
34 | quotes: none
35 |
36 | blockquote:before, blockquote:after,
37 | q:before, q:after
38 | content: none
39 |
40 | table
41 | border-collapse: collapse
42 | border-spacing: 0
43 |
44 | /* custom */
45 |
46 | a
47 | color: #7e8c8d
48 | -webkit-backface-visibility: hidden
49 | text-decoration: none
50 |
51 | li
52 | list-style: none
53 |
54 | body
55 | -webkit-text-size-adjust: none
56 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0)
57 |
--------------------------------------------------------------------------------
/src/common/stylus/variable.styl:
--------------------------------------------------------------------------------
1 | // 颜色定义规范
2 | $color-background = #ffffff
3 | $color-background-d = rgba(1, 25, 53, 0.3)
4 | $color-highlight-background = rgb(3, 82, 90)
5 | $color-dialog-background = #376956
6 | $color-theme = #1db0b8
7 | $color-theme-d = rgba(55, 198, 192, 0.8)
8 | $color-sub-theme = #d93f30
9 | $color-text = #37c6c0
10 | $color-text-d = rgba(255, 255, 255, 0.3)
11 | $color-text-l = rgba(255, 255, 255, 0.5)
12 | $color-text-ll = rgba(255, 255, 255, 0.8)
13 | $color-active = #42b983
14 |
15 | //字体定义规范
16 | $font-size-small-s = 10px
17 | $font-size-small = 12px
18 | $font-size-medium = 14px
19 | $font-size-medium-x = 16px
20 | $font-size-large = 18px
21 | $font-size-large-x = 22px
--------------------------------------------------------------------------------
/src/components/HelloWorld.vue:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/src/components/HelloWorld.vue
--------------------------------------------------------------------------------
/src/components/footer/footer.vue:
--------------------------------------------------------------------------------
1 |
2 |
17 |
18 |
19 |
32 |
33 |
57 |
--------------------------------------------------------------------------------
/src/components/hot/hot.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
57 |
58 |
77 |
--------------------------------------------------------------------------------
/src/components/list/list.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
![]()
7 |
8 | {{item.member.username}}
9 | {{item.created | normalizeTime}}
10 |
11 |
12 |
{{item.node.title}}
13 |
14 |
15 | {{item.replies}}
16 |
17 |
18 |
19 |
20 | {{item.title}}
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
82 |
83 |
149 |
--------------------------------------------------------------------------------
/src/components/listDetail/listDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
12 |
13 | {{detail.title}}
14 |
15 |
16 |
![]()
17 |
18 |
{{detail.member ? detail.member.username : ''}}
19 |
20 |
{{detail.node ? detail.node.title : ''}}
21 |
|
22 |
{{timerline}}
23 |
24 |
25 |
26 |
27 |
28 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
130 |
131 |
226 |
--------------------------------------------------------------------------------
/src/components/loading/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/src/components/loading/loading.gif
--------------------------------------------------------------------------------
/src/components/loading/loading.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |

4 |
{{title}}
5 |
6 |
7 |
17 |
31 |
--------------------------------------------------------------------------------
/src/components/nodes/nodeList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
{{tech.name}}
6 |
7 | -
8 | {{item.desc}}
9 |
10 |
11 |
12 |
13 |
{{creative.name}}
14 |
15 | -
16 | {{item.desc}}
17 |
18 |
19 |
20 |
21 |
{{play.name}}
22 |
23 | -
24 | {{item.desc}}
25 |
26 |
27 |
28 |
29 |
{{work.name}}
30 |
31 | -
32 | {{item.desc}}
33 |
34 |
35 |
36 |
37 |
38 |
39 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
194 |
195 |
244 |
--------------------------------------------------------------------------------
/src/components/now/now.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
58 |
59 |
65 |
--------------------------------------------------------------------------------
/src/components/scroll/scroll.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
150 |
151 |
160 |
--------------------------------------------------------------------------------
/src/components/userDetail/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import user from './userDetail.vue'
3 |
4 | let UserDetailConstructor = Vue.extend(user)
5 |
6 | let instance
7 | let instances = []
8 | let seed = 1
9 |
10 | function UserDetail(options) {
11 | options = options || {}
12 | if (typeof options === 'string') {
13 | options = {
14 | name: options
15 | }
16 | }
17 | let id = 'user_' + seed++
18 | instance = new UserDetailConstructor({
19 | data: options
20 | })
21 | instance.id = id
22 | instance.vm = instance.$mount()
23 | document.body.appendChild(instance.vm.$el)
24 | instance.vm.show = true
25 | instances.push(instance)
26 | }
27 | const install = Vue => {
28 | Vue.prototype.$user = UserDetail
29 | }
30 |
31 | export default install
32 |
--------------------------------------------------------------------------------
/src/components/userDetail/userDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
![]()
9 |
{{name}}
10 |
加入时间:{{createTime | normalizeTime}}
11 |
url: {{url}}
12 |
18 |
19 |
20 |
21 |
22 |
23 |
88 |
89 |
123 |
124 |
--------------------------------------------------------------------------------
/src/entry-client.js:
--------------------------------------------------------------------------------
1 | import { createApp } from './app'
2 |
3 | // 客户端特定引导逻辑……
4 |
5 | const { app } = createApp()
6 |
7 | // 这里假定 App.vue 模板中根元素具有 `id="app"`
8 | app.$mount('#app')
9 |
--------------------------------------------------------------------------------
/src/entry-server.js:
--------------------------------------------------------------------------------
1 | import { createApp } from './app'
2 |
3 | export default context => {
4 | const { app, router } = createApp()
5 | router.push(context.url)
6 | router.onReady(() => {
7 | const matchedComponents = router.getMatchedComponents()
8 | // 匹配不到的路由,执行 reject 函数,并返回 404
9 | if (!matchedComponents.length) {
10 | return reject({ code: 404 })
11 | }
12 | // Promise 应该 resolve 应用程序实例,以便它可以渲染
13 | resolve(app)
14 | }, reject)
15 | }
16 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | // The Vue build version to load with the `import` command
2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
3 | import Vue from 'vue'
4 | import App from './App.vue'
5 | import router from './router/index.js'
6 | import lazyload from 'vue-lazyload'
7 | // import mandMobile from 'mand-mobile'
8 | // Vue.use(mandMobile)
9 |
10 | // 引入css
11 | import './common/stylus/index.styl'
12 | import './common/css/border.css'
13 | // 引入Icon图库
14 | import 'vue-awesome/icons'
15 | import Icon from 'vue-awesome/components/Icon'
16 | Vue.component('icon', Icon)
17 |
18 | import fastclick from 'fastclick'
19 | fastclick.attach(document.body)
20 |
21 | import UserDetail from './components/userDetail/index'
22 | Vue.use(UserDetail)
23 |
24 | // response
25 | import './responsive.js'
26 |
27 |
28 | // 懒加载图片
29 | Vue.use(lazyload, {
30 | loading: require('@/assets/logo.png')
31 | })
32 | Vue.config.productionTip = false
33 |
34 | /* eslint-disable no-new */
35 | new Vue({
36 | el: '#app',
37 | router,
38 | components: { App },
39 | render: h => h(App)
40 | })
41 |
--------------------------------------------------------------------------------
/src/responsive.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | (function (window, document) {
3 | function resize () {
4 | var ww = window.innerWidth
5 | if (ww > window.screen.width) {
6 | window.requestAnimationFrame(resize)
7 | } else {
8 | if (ww > 720) {
9 | ww = 720
10 | }
11 | document.documentElement.style.fontSize = 100 * 100 / 750 + 'vw'
12 | document.body.style.opacity = 1
13 | }
14 | }
15 |
16 | if (document.readyState !== 'loading') {
17 | resize()
18 | } else {
19 | document.addEventListener('DOMContentLoaded', resize)
20 | }
21 |
22 | window.addEventListener('resize', resize)
23 | })(window, document)
24 |
--------------------------------------------------------------------------------
/src/router/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 | const now = () => import('components/now/now')
4 | const hot = () => import('components/hot/hot')
5 | const listDetail = () => import('components/listDetail/listDetail')
6 | const nodes = () => import('components/nodes/nodeList')
7 |
8 | Vue.use(Router)
9 |
10 | export default new Router({
11 | mode: 'history',
12 | routes: [
13 | {
14 | path: '/',
15 | redirect: '/now'
16 | },
17 | {
18 | path: '/now',
19 | name: '最新',
20 | component: now,
21 | children: [
22 | {
23 | path: ':id',
24 | component: listDetail
25 | }
26 | ]
27 | },
28 | {
29 | path: '/hot',
30 | name: '最热',
31 | component: hot,
32 | children: [
33 | {
34 | path: ':id',
35 | component: listDetail
36 | }
37 | ]
38 | },
39 | {
40 | path: '/nodes',
41 | name: '节点',
42 | component: nodes,
43 | children: [
44 | {
45 | path: ':id',
46 | component: listDetail
47 | }
48 | ]
49 | }
50 | ]
51 | })
52 |
--------------------------------------------------------------------------------
/src/server-app.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 | import { createRouter } from './router'
4 |
5 | // 导出一个工厂函数,用于创建新的
6 | // 应用程序、router 和 store 实例
7 | export function createApp() {
8 | const router = createRouter()
9 | const app = new Vue({
10 | // 注入 router 到根 Vue 实例
11 | router,
12 | // 根实例简单的渲染应用程序组件。
13 | render: h => h(App)
14 | })
15 | return { app, router }
16 | }
17 |
--------------------------------------------------------------------------------
/src/server-router.js:
--------------------------------------------------------------------------------
1 | // router.js
2 | import Vue from 'vue'
3 | import Router from 'vue-router'
4 |
5 | Vue.use(Router)
6 |
7 | export function createRouter() {
8 | return new Router({
9 | mode: 'history',
10 | routes: [
11 | // ...
12 | ]
13 | })
14 | }
15 |
--------------------------------------------------------------------------------
/static/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/static/.gitkeep
--------------------------------------------------------------------------------