国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

從0到1構建vueSSR項目之node以及vue-cli3的配置

2019-11-19 12:01:51
字體:
來源:轉載
供稿:網友

前言

上一次做了路由的相關配置,原本計劃今天要做vuex部分,但是想了想,發現vuex單獨的客戶端部分穿插解釋起來很麻煩,所以今天改做服務端部分。

服務端部分做完,再去做vuex的部分,這樣就會很清晰。

vue ssr是分兩個端,一個是客戶端,一個是服務端。

所以要做兩個cli3的配置。

那么下面就直接開始做吧。

修改package.json的命令

//package.json :client代表客戶端 :server代表服務端//使用VUE_NODE來作為運行環境是node的標識//cli3內置 命令 --no-clean 不會清除dist文件  "scripts": {    "serve:client": " vue-cli-service serve",    "build":"npm run build:server -- --silent && npm run build:client -- --no-clean --silent",    "build:client": "vue-cli-service build",    "build:server": "cross-env VUE_NODE=node vue-cli-service build",    "start:server": "cross-env NODE_ENV=production nodemon nodeScript/index"  }

修改vue.config.js配置

添加完相關腳本命令之后,我們開始改造cli3配置。

首先要require('vue-server-renderer')

然后再根據VUE_NODE環境變量來決定編譯的走向以及生成不同的環境清單

先做cli3服務端的入口文件

// src/entry/server.jsimport {  createApp} from '../main.js'export default context => {  return new Promise((resolve, reject) => {    const {      app,      router    } = createApp(context.data)    //根據node傳過來的路由 來調用router路由的指向    router.push(context.url)    router.onReady(() => {      //獲取當前路由匹配的組件數組。      const matchedComponents = router.getMatchedComponents()      //長度為0就是沒找到該路由所匹配的組件      //可以路由設置重定向或者傳回node node來操作也可以      if (!matchedComponents.length) {        return reject({          code: 404        })      }      resolve(app)    }, reject)  })}

這里是cli3的配置

//vue.config.jsconst ServerPlugin = require('vue-server-renderer/server-plugin'),//生成服務端清單   ClientPlugin = require('vue-server-renderer/client-plugin'),//生成客戶端清單   nodeExternals = require('webpack-node-externals'),//忽略node_modules文件夾中的所有模塊   VUE_NODE = process.env.VUE_NODE === 'node',   entry = VUE_NODE ? 'server' : 'client';//根據環境變量來指向入口module.exports = {  css: {    extract: false//關閉提取css,不關閉 node渲染會報錯  },  configureWebpack: () => ({    entry: `./src/entry/${entry}`,    output: {      filename: 'js/[name].js',      chunkFilename: 'js/[name].js',      libraryTarget: VUE_NODE ? 'commonjs2' : undefined    },    target: VUE_NODE ? 'node' : 'web',    externals: VUE_NODE ? nodeExternals({      //設置白名單      whitelist: //.css$/    }) : undefined,    plugins: [//根據環境來生成不同的清單。      VUE_NODE ? new ServerPlugin() : new ClientPlugin()    ]  }),  chainWebpack: config => {    config.resolve      .alias        .set('vue$', 'vue/dist/vue.esm.js')    config.module      .rule('vue')        .use('vue-loader')          .tap(options => {            options.optimizeSSR = false;            return options;          });    config.module      .rule('images')        .use('url-loader')          .tap(options => {            options = {              limit: 1024,              fallback:'file-loader?name=img/[path][name].[ext]'            }            return options;          });  }}

node相關配置

用于node渲染 必然要攔截get請求的。然后根據get請求地址來進行要渲染的頁面。

官方提供了vue-server-renderer插件

大概的方式就是 node攔截所有的get請求,然后將獲取到的路由地址,傳給前臺,然后使用router實例進行push

再往下面看之前 先看一下官方文檔

創建BundleRenderer
createBundleRenderer

將 Vue 實例渲染為字符串。
renderToString

渲染應用程序的模板
template

生成所需要的客戶端或服務端清單
clientManifest

先創建 服務端所需要的模板

//public/index.nodeTempalte.html<!DOCTYPE html><html>  <head>    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width,initial-scale=1.0">    <link rel="icon" href="/favicon.ico" rel="external nofollow" >    <meta charset="utf-8">    <title>vuessr</title>  </head>  <body>    <!--vue-ssr-outlet-->  </body></html>

node部分

先創建三個文件
index.js //入口
proxy.js //代理
server.js //主要配置

//server.jsconst fs = require('fs');const { resolve } = require('path');const express = require('express');const app = express();const proxy = require('./proxy');const { createBundleRenderer } = require('vue-server-renderer')//模板地址const templatePath = resolve(__dirname, '../public/index.nodeTempalte.html')//客戶端渲染清單const clientManifest = require('../dist/vue-ssr-client-manifest.json')//服務端渲染清單const bundle = require('../dist/vue-ssr-server-bundle.json')//讀取模板const template = fs.readFileSync(templatePath, 'utf-8')const renderer = createBundleRenderer(bundle,{  template,  clientManifest,  runInNewContext: false})//代理相關proxy(app);//請求靜態資源相關配置app.use('/js', express.static(resolve(__dirname, '../dist/js')))app.use('/css', express.static(resolve(__dirname, '../dist/css')))app.use('/font', express.static(resolve(__dirname, '../dist/font')))app.use('/img', express.static(resolve(__dirname, '../dist/img')))app.use('*.ico', express.static(resolve(__dirname, '../dist')))//路由請求app.get('*', (req, res) => {  res.setHeader("Content-Type", "text/html")  //傳入路由 src/entry/server.js會接收到 使用vueRouter實例進行push  const context = {    url: req.url  }  renderer.renderToString(context, (err, html) => {    if (err) {      if (err.url) {        res.redirect(err.url)      } else {        res.status(500).end('500 | 服務器錯誤');        console.error(`${req.url}: 渲染錯誤 `);        console.error(err.stack)      }    }    res.status(context.HTTPStatus || 200)    res.send(html)  })})module.exports = app;//proxy.jsconst proxy = require('http-proxy-middleware');function proxyConfig(obj){  return {    target:'localhost:8081',    changeOrigin:true,    ...obj  }}module.exports = (app) => {  //代理開發環境  if (process.env.NODE_ENV !== 'production') {    app.use('/js/main*', proxy(proxyConfig()));    app.use('/*hot-update*',proxy(proxyConfig()));    app.use('/sockjs-node',proxy(proxyConfig({ws:true})));  }}//index.jsconst app = require('./server')app.listen(8080, () => { console.log('/033[42;37m DONE /033[40;33m localhost:8080 服務已啟動/033[0m')})

做完這一步之后,就可以預覽基本的服務渲染了。

后面就只差開發環境的配置,以及到node數據的傳遞(vuex)

npm run buildnpm run start:server打開localhost:8080F12 - Network - Doc 就可以看到內容

最終目錄結構

|-- vuessr  |-- .gitignore  |-- babel.config.js  |-- package-lock.json  |-- package.json  |-- README.md  |-- vue.config.js  |-- nodeScript //node 渲染配置  |  |-- index.js  |  |-- proxy.js  |  |-- server.js  |-- public//模板文件  |  |-- favicon.ico  |  |-- index.html  |  |-- index.nodeTempalte.html  |-- src    |-- App.vue    |-- main.js    |-- router.config.js//路由集合    |-- store.config.js//vuex 集合    |-- assets//全局靜態資源源碼    |  |-- 備注.txt    |  |-- img    |    |-- logo.png    |-- components//全局組件    |  |-- Head    |    |-- index.js    |    |-- index.scss    |    |-- index.vue    |    |-- img    |      |-- logo.png    |-- entry//cli3入口    |  |-- client.js    |  |-- server.js    |  |-- 備注.txt    |-- methods//公共方法    |  |-- 備注.txt    |  |-- mixin    |    |-- index.js    |-- pages//源碼目錄    |  |-- home    |  |  |-- index.js    |  |  |-- index.scss    |  |  |-- index.vue    |  |  |-- img    |  |  |  |-- flow.png    |  |  |  |-- head_portrait.jpg    |  |  |  |-- logo.png    |  |  |  |-- vuessr.png    |  |  |-- vue    |  |  |  |-- index.js    |  |  |  |-- index.scss    |  |  |  |-- index.vue    |  |  |-- vueCli3    |  |  |  |-- index.js    |  |  |  |-- index.scss    |  |  |  |-- index.vue    |  |  |-- vueSSR    |  |  |  |-- index.js    |  |  |  |-- index.scss    |  |  |  |-- index.vue    |  |  |-- vuex    |  |    |-- index.js    |  |    |-- index.scss    |  |    |-- index.vue    |  |-- router//路由配置    |  |  |-- index.js    |  |-- store//vuex配置    |    |-- all.js    |    |-- gather.js    |    |-- index.js    |-- static//cdn資源      |-- 備注.txt

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 遂川县| 左贡县| 全南县| 竹溪县| 池州市| 陈巴尔虎旗| 万盛区| 丰都县| 天长市| 香河县| 中阳县| 山阳县| 榆中县| 长宁区| 喜德县| 克东县| 营山县| 甘谷县| 明光市| 云和县| 南平市| 昌都县| 曲周县| 大同县| 河间市| 辽阳县| 汾阳市| 仁怀市| 巩义市| 浦东新区| 仪征市| 府谷县| 茂名市| 乐清市| 惠来县| 托克逊县| 日喀则市| 天津市| 柞水县| 潮安县| 永川市|