Giter Club home page Giter Club logo

vue-demo's Introduction

前言

这个项目最开始建立的是2016年的时候,如今已经过去了6年多,时光匆匆,如今 TS 已经流行起来,并且自己已经在 SSR 方面实践颇多,所以就花了半天的时间使用 Genesis 写了一个完整的 Vue SSR 的demo。

快速开发

# 开发环境启动
npm run dev
# 打包生产环境代码
npm run build
# 执行TS类型检查
npm run type-check
# 生产环境运行
npm run start

更新日志

  • 2022-08
  • 2022-02
    • 升级Genesis2.0版本
    • 能支持全文件类型检查,并且生成类型文件
    • 如果对 SSR 微服务架构感兴趣,点击这里来看看
    • 新增了Docker打包的脚本,并且可以在本地运行Docker镜像

Docker

执行./docker-build.sh命令构建镜像,举一反三,具体编写逻辑请查看./docker-build.shDockerfile文件

技术栈

  • Vue
  • Genesis
  • vue-router
  • vuex
  • axios
  • vue-meta
  • TS

功能点

  • 实现登录、退出、微博列表
  • 使用 vue-meta 管理页面 SEO 的信息
  • 使用 TS 封装了 axios 的请求类,涉及到服务端请求的 header 转发
  • 编写了 Vue 的基类,使得 Vue、Vuex 和 TS 的配合更好
  • 完整的展示了开发 Vue SSR 项目所需要注意的知识点
  • 基于 Genesis 开发的完整功能的 demo
  • 演示了如何在服务端预取数据,在客户端还原服务端状态
  • 演示了如何编译 SSR 和 TS 生产环境的代码

目录说明

.
├── dist                  yarn build 编译后的源码目录
├── mock                  模拟接口
│   └── mock.ts           实现登录、退出、微博列表的 mock api
├── src                   源码目录
│   ├── components        公共组件
│   |   └── v-header.vue  封装一个头部的组件
|   ├── request           请求处理目录
|   |   └── index.ts      封装 axios 请求类的实现
|   ├── router            路由管理目录
|   |   └── index.ts      提供创建路由的方法
|   ├── store             状态管理目录
|   |   └── index.ts      程序全局状态的实现
|   ├── utils             封装工具函数目录
|   |   └── index.ts      工具函数的封装
|   ├── views             页面目录
|   |   ├── home.vue      网站首页
|   |   └── signin.vue    登录页面
|   ├── app.vue           应用的公共组件
├── ├── index.html        SSR 渲染的基本 html 模板
|   ├── base-vue.ts       对 Vue 封装一封,包装 vuex、request
|   ├── entry-client.ts   客户端入口文件
|   ├── entry-server.ts   服务端入口文件
|   └── shims-vue.d.ts    Vue 文件的 TS 声明
├── .editorconfig         编辑器配置
├── .eslintignore         eslint 的忽略配置
├── .eslintrc.js          eslint 的配置
├── .gitignore            git 的忽略文件
├── .stylelintignore      stylelint 的忽略文件
├── build.sh              编译生产环境代码到 dist 目录,yarn start 执行
├── genesis.build.ts      Genesis 构建生产环境代码
├── genesis.dev.ts        dev 环境开发入口
├── genesis.prod.ts       生产环境开发入口
├── genesis.ts            dev 和 生产环境,通用逻辑封装
├── package.json          包管理配置
├── README.md             项目说明文档
├── stylelint.config.js   stylelint 的配置文件
├── tsconfig.json         TS 的配置文件
├── tsconfig.node.json    Node 运行程序使用 TS 的配置文件
└── yarn.lock             yarn 的依赖版本锁

vue-demo's People

Contributors

dependabot[bot] avatar lzxb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vue-demo's Issues

npm run dev

[HPM] Proxy created: **  ->  https://cnodejs.org/
events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE :::3000
    at Object.exports._errnoException (util.js:953:11)
    at exports._exceptionWithHostPort (util.js:976:20)
    at Server._listen2 (net.js:1253:14)
    at listen (net.js:1289:10)
    at Server.listen (net.js:1385:5)
    at Server.listen (/Users/kevinli/Desktop/vue2-demo/node_modules/.npminstall/webpack-dev-server/1.16.2/webpack-dev-server/lib/Server.js:324:27)
    at Object.<anonymous> (/Users/kevinli/Desktop/vue2-demo/server.js:20:8)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
    at startup (node.js:160:18)
    at node.js:449:3

代理没成功 不知道啥原因

有个问题想请教下

image
你这里为什么要用这种方式

用dispatch 不是更好吗 例如
this.$store.dispatch(USER_SIGN_IN,this.form);
this.$router.push('idx');

npm run dev 创建代理 不能访问项目

npm install
npm run dev 后 提示

node server
[HPM] Proxy crated: **  ->  https://cnodejs.org/
http://localhost:3000/app

打开localhost地址后显示的是 cnodejs.org的页面?

编译后的文件到底输出到哪里了?

webpack编译成功, 浏览器中也可以通过[http://localhost:3000/app/#/] 访问.
但是奇怪的是, 怎么也找不到编译后输出的文件.
配置的不是放到项目目录/app/下, 为什么找不到文件, 浏览器里却可以访问呢?
拜托, 求助!!!

别名配置后开发环境ok,yarn run build报错

`
export const ssr = new SSR({

name: 'ssr-demo',

build: {

    alias: {

        '@': path.resolve(__dirname, './src')

    },

    template: path.resolve(__dirname, './index.html')

}

});
`
别名配置后开发环境ok,yarn run build报错
image

关于用户登录退出的问题

我尝试使用了一下这个登录模块,碰到了一个问题:

目前的登录和退出是由vuex中的状态来控制的,
0. 登录时添加状态,

  1. 路由切换时通过钩子检查该状态是否存在,

但是这样有一个问题,无论当前的URL在哪,只要刷新页面,vuex被清空,用户就一定会退出。
这是确实存在的问题,还是我漏了什么关键部分?

我的解决办法是将状态保存了一份在session/localStorage中,路由切换时检查,
可是这样一来,原本vuex的状态就变得非常鸡肋。

望赐教

推荐

给推荐几个Vue2的开源后台项目,一些系统的后端管理系统,供管理员使用的。

npm run dev问题

最后一步运行的时候出错:
c:\Users\Administrator\Documents\Vue\git\vue2-demo-master>cnpm run dev

[email protected] dev c:\Users\Administrator\Documents\Vue\git\vue2-demo-master
node server

module.js:538
throw err;
^

Error: Cannot find module 'autoprefixer'
at Function.Module._resolveFilename (module.js:536:15)
at Function.Module._load (module.js:466:25)
at Module.require (module.js:579:17)
at require (internal/module.js:11:18)
at Object. (c:\Users\Administrator\Documents\Vue\git\vue2-demo-master\webpack.config.js:80:13)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Module.require (module.js:579:17)
at require (internal/module.js:11:18)
at Object. (c:\Users\Administrator\Documents\Vue\git\vue2-demo-master\server.js:3:23)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)

安装了autoprefixer也运行不了

请问vsCode ,es2016语法提示报错问题

clone项目下来,用的是vsCode编辑器,于是我也下了,很好用,有个小问题请教下。

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };

主要是...这种,vsCode会提示报错(在.js文件中),找了很久没有找到解决办法,求指导呀

error in node 14.5

Hi, I got this error when run on node 14.5
downgrade to 12 working well

please take a look. thanks

Error: Module parse failed: Unexpected token (76:21)
File was processed with these loaders:
 * ./node_modules/babel-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|       enumerable: false,
|       value: {
>         title: title?.text() || '',
|         meta: meta?.text() || '',
|         link: link?.text() || '',
    at Object../src/entry-server.ts (js/app.js:136:7)
    at __webpack_require__ (webpack/bootstrap:19:0)
    at Object../dist/ssr-genesis/src/entry-server.ts (dist/ssr-genesis/src/entry-server.ts:3:15)
    at __webpack_require__ (webpack/bootstrap:19:0)
    at Object.0 (js/app.js:147:18)
    at __webpack_require__ (webpack/bootstrap:19:0)
    at js/app.js:85:18
    at Object.<anonymous> (js/app.js:88:10)
    at evaluateModule (/Users/root/MyProjects/nodejs/vue2-demo/node_modules/vue-server-renderer/build.dev.js:9318:21)
    at /Users/root/MyProjects/nodejs/vue2-demo/node_modules/vue-server-renderer/build.dev.js:9376:18

项目拉下来无法运行需要添加@babel/plugin-proposal-optional-chaining支持

如题,项目用了ts 的 ?。的方法去做 但是没有支持的插件

image

所以需要在
genesis.ts 里 webpackchai增加下支持

class ChainingPlugin extends Plugin {
    /**
     * 修改webpack的配置
     */
    public chainWebpack({ config }: WebpackHookParams) {
        config.module
            .rule("ts")
            .test(/\.(t)sx?$/)
            .use("babel")
            .loader("babel-loader")
            .tap(options => {
                const { plugins } = options;
                plugins.push(["@babel/plugin-proposal-optional-chaining"]);
                options.plugins = plugins;
                return options;
            })
            .end();
    }
}

//这里增加下刚写的
ssr.plugin.use(new ChainingPlugin (ssr));

使用饿了么组件报错

http://mint-ui.github.io/docs/#!/zh-cn2

我使用以上组件,按照文档的步骤能够跑起来项目,单独跑你的项目也能ok,我想结合一下,
在.babelrc 里 增加了 { "modules": false }
"plugins": [["component", [
{
"libraryName": "mint-ui",
"style": true
}
]]]

然后就报错了,麻烦能指点一下么?

请教一下

我想了很久实在不明白
为什么component里的header.vue不是已经export default了么 为什么还要单独创建一个index,js来export default一遍呢? 关键是我把这个index.js删除了还不行。。。

使用 npm run dev:dist 编译后 运行报错

Uncaught ReferenceError: production is not defined
    at Object.<anonymous> (main.js?48c8f86…:18)
    at e (main.js?48c8f86…:1)
    at Object.<anonymous> (main.js?48c8f86…:1)
    at e (main.js?48c8f86…:1)
    at Object.<anonymous> (main.js?48c8f86…:1)
    at e (main.js?48c8f86…:1)
    at main.js?48c8f86…:1
    at main.js?48c8f86…:1
(anonymous) @ main.js?48c8f86…:18
e @ main.js?48c8f86…:1
(anonymous) @ main.js?48c8f86…:1
e @ main.js?48c8f86…:1
(anonymous) @ main.js?48c8f86…:1
e @ main.js?48c8f86…:1
(anonymous) @ main.js?48c8f86…:1
(anonymous) @ main.js?48c8f86…:1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.