最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用node+vue.js實現(xiàn)SPA應(yīng)用

 更新時間:2016年01月28日 09:00:22   投稿:hebedich  
這篇文章主要介紹了使用node+vue.js實現(xiàn)SPA應(yīng)用的相關(guān)資料,需要的朋友可以參考下

業(yè)務(wù)需求

最近公司要求開發(fā)web版的app,由于app是偏向內(nèi)容方面,而且?guī)Я艘粋€聊天模塊,所以一般的多頁開發(fā)不是很適合,而且主要是手機瀏覽,對加載速度或者用戶體驗來說都比較苛刻。調(diào)研了很多框架和模式,最后自己東拼西湊搞出來了這么一個玩意。

服務(wù)端

毫無疑問使用node,使用typescript可以有效的在編碼同時查錯,強類型語言寫服務(wù)端毫無壓力。

#app.ts 只貼重要代碼

var webpack = require('webpack')
var webpackDevMiddleware = require('webpack-dev-middleware')
var WebpackConfig = require('./webpack.config')

import * as index from "./routes/index";
import * as foo from "./routes/foo";
import * as bar from "./routes/bar";

var app = express();

//啟動服務(wù)的時候 打包并監(jiān)聽客戶端用到的文件,webpackDevMiddleware是開發(fā)模式,他會打包js在內(nèi)存里面,你改了文件,它也會重新打包
app.use(webpackDevMiddleware(webpack(WebpackConfig), {
  publicPath: '/__build__/',
  stats: {
    colors: true
  }
}));

//一般的配置項
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.set('view options', { layout: false });
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(methodOverride());
app.use(express.static(__dirname + '/public'));

var env = process.env.NODE_ENV || 'development';
if (env === 'development') {
  app.use(errorHandler());
}

//路由配置
app.get('/', index.index);
app.get('/foo', foo.index);
app.get('/bar', bar.index);


app.listen(3000, function(){
  console.log("Demo Express server listening on port %d in %s mode", 3000, app.settings.env);
});

export var App = app;

服務(wù)端渲染頁面

#index.ts
import express = require("express")
import vueServer = require("vue-server") //服務(wù)端渲染vue的插件

var Vue = new vueServer.renderer(); //創(chuàng)建一個服務(wù)端的vue

export function index(req: express.Request, res: express.Response) {

  //創(chuàng)建一個組件
  var vm = new Vue({
    template: `
    <p>This is index!</p>
    `
  });

  //等待html渲染完成,再返回給瀏覽器 vueServer.htmlReady是vue-server的自帶事件
  vm.$on('vueServer.htmlReady', function(html:string) {
    //這里用的是ejs模板 可以把需要用到的數(shù)據(jù)設(shè)置成window下的全局變量,方便客戶端的js訪問。
    res.render('layout',{server_html:html,server_data:'window.cm_data = {name:"張三"}'})
  });

};

#layout.ejs 訪問這個SPA的所有url返回的都是這個頁面 <meta>標簽都可以動態(tài)設(shè)置,只要傳參數(shù)進來就可以
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Vue Router Example</title>
  <style>
    .v-link-active {
      color: red;
    }
  </style>
  <script>
    //定義一些前端需要用到的全局屬性,文章ID或用戶信息什么的
    //index.ts中傳過來的是 window.cm_data = {name:"張三"}
    //前端就能訪問到了
    <%-server_data%>
  </script>
</head>
<body>

//這里的id是前端需要用到的一個標識
<div id="app">
  <h1>Hello App!</h1>
  <p>
    <a v-link="{ path: '/foo' }">Go to Foo</a>
    <a v-link="{ path: '/bar' }">Go to Bar</a>
  </p>
  //router-view是客戶端vue-router需要解析的dom
  //server_html是根據(jù)訪問url地址生成的html,是做SEO的重點,不加載下面的app.js也可以看到內(nèi)容
  <router-view> <%-server_html%> </router-view>
</div>
//webpack打包好的js,主要是路由配置
<script src="/__build__/app.js"></script>
</body>
</html>

客戶端

#app.js 這個是/__build__/app.js,可以用es6編寫,webpack會轉(zhuǎn)換的

import Vue from './vue.min' //客戶端的vue.js
import VueRouter from './vue-router.min' //vue的路由插件,配合webpack可以很簡單實現(xiàn)懶加載

//懶加載路由 只有訪問這個路由才會加載js
import Foo from 'bundle?lazy!../../components/foo' //配合webpack的bundle-loader,輕松實現(xiàn)懶加載
import Bar from 'bundle?lazy!../../components/bar'
import Index from 'bundle?lazy!../../components/index'

var App = Vue.extend({})

Vue.use(VueRouter)

var router = new VueRouter({
  //這里要好好說一下,一定要設(shè)置html5模式,不然前后端URL不統(tǒng)一會發(fā)生問題
  //比如訪問 http://localhost:3000/ 服務(wù)端定義是訪問index.ts這個路由文件
  //如果不是html5模式的話,經(jīng)過客戶端js運行之后會變成http://localhost:3000/#!/
  
  //在比如直接瀏覽器輸入 http://localhost:3000/foo 服務(wù)端定義是訪問.ts這個路由文件
  //如果不是html5模式的話,經(jīng)過客戶端js運行之后會變成 http://localhost:3000/foo/#!/
  
  //設(shè)置了html5模式后,加載完js后不會加上#!這2個類似錨點的字符,實現(xiàn)前后端路由統(tǒng)一如果用戶刷新瀏覽器的話,服務(wù)端也能渲染出相應(yīng)的頁面。
  history: true, //html5模式 去掉錨點 
  saveScrollPosition: true //記住頁面的滾動位置 html5模式適用
})

//定義路由,要和服務(wù)端路由路徑定義的一樣
router.map({
  '/'  : {
    component: Index //前端路由定義,
  },
  '/foo': {
    component: Foo
  },
  '/bar': {
    component: Bar
  }
})

//啟動APP
router.start(App, '#app')

需要完善的地方

前后端統(tǒng)一模板,已經(jīng)找到方法了把html分離出來,node端用fs.readFileSync方法獲取,客戶端用webpack的raw-loader獲取html內(nèi)容

不放源碼都是瞎扯。

源碼地址

https://github.com/yjj5855/node-vue-server-webpack

相關(guān)文章

  • typescript nodejs 依賴注入實現(xiàn)方法代碼詳解

    typescript nodejs 依賴注入實現(xiàn)方法代碼詳解

    今天分享的是用typescript語言實現(xiàn)的ioc模式,這邊用到的主要組件是 reflect-metadata 這個組件可以獲取或者設(shè)置元數(shù)據(jù)信息,接下來通過本文給大家介紹typescript nodejs 依賴注入實現(xiàn)方法,需要的朋友可以參考下
    2019-07-07
  • node.js利用socket.io實現(xiàn)多人在線匹配聯(lián)機五子棋

    node.js利用socket.io實現(xiàn)多人在線匹配聯(lián)機五子棋

    這篇文章主要介紹了node.js利用socket.io實現(xiàn)多人在線匹配聯(lián)機五子棋的操作方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-05-05
  • Express使用multer實現(xiàn)文件上傳的示例代碼

    Express使用multer實現(xiàn)文件上傳的示例代碼

    這篇文章主要介紹了Express 使用 multer 實現(xiàn)文件上傳的操作步驟,文中通過代碼示例和圖文結(jié)合的方式講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • 深入nodejs中流(stream)的理解

    深入nodejs中流(stream)的理解

    本篇文章主要介紹了深入nodejs中流(stream)的理解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • node將geojson轉(zhuǎn)shp返回給前端的實現(xiàn)方法

    node將geojson轉(zhuǎn)shp返回給前端的實現(xiàn)方法

    這篇文章主要介紹了node將geojson轉(zhuǎn)shp返回給前端的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • NodeJs實現(xiàn)簡單的爬蟲功能案例分析

    NodeJs實現(xiàn)簡單的爬蟲功能案例分析

    爬蟲,是一種按照一定的規(guī)則,自動地抓取網(wǎng)頁信息的程序或者腳本。這篇文章通過一個案例給大家分享NodeJs實現(xiàn)簡單的爬蟲功能,感興趣的朋友一起看看吧
    2018-12-12
  • Node文件操作匯總實例詳解

    Node文件操作匯總實例詳解

    這篇文章主要為大家介紹了Node文件操作匯總實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • node.js基礎(chǔ)知識小結(jié)

    node.js基礎(chǔ)知識小結(jié)

    本文給大家匯總介紹了學習node.js的一些關(guān)于開發(fā)環(huán)境的基礎(chǔ)知識,非常簡單,給新手們參考下
    2018-02-02
  • node結(jié)合swig渲染摸板的方法

    node結(jié)合swig渲染摸板的方法

    本篇文章主要介紹了node結(jié)合swig渲染摸板的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • nvm報錯Now?using?node?v版本號(64-bit)圖文解決方法

    nvm報錯Now?using?node?v版本號(64-bit)圖文解決方法

    這篇文章主要給大家介紹了關(guān)于nvm報錯Now?using?node?v版本號(64-bit)的解決方法,文中將解決的辦法介紹的非常詳細,對遇到這個問題的朋友具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-11-11

最新評論

抚州市| 内丘县| 通山县| 新化县| 旬邑县| 桐乡市| 城固县| 和林格尔县| 门源| 新营市| 读书| 松潘县| 乌鲁木齐县| 公主岭市| 乌兰察布市| 遵化市| 镇原县| 赣榆县| 永昌县| 浦北县| 来宾市| 大姚县| 普兰店市| 南通市| 古交市| 广德县| 闸北区| 西吉县| 客服| 长治市| 碌曲县| 谷城县| 临沭县| 克拉玛依市| 古田县| 宿州市| 邢台县| 科技| 共和县| 德惠市| 黔西县|