- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本文将介绍如何使用Nuxtjs对vue项目进行ssr和静态化处理.
首先,我们简单了解下Nuxtjs框架,Nuxt.js是一个基于Vue的通用框架,主要用于解决Vue项目的服务端渲染(SSR)。 它本质上是一个Vue框架,增加一层node服务,通过对客户端/服务端的抽象封装,使用Nuxt各种资源配置,处理服务端渲染。 除了服务端渲染以外,Nuxtjs还提供生成静态化站点的能力.
当我们需要进行SSR服务端渲染处理,使用Nuxtjs的时候,为了避免各种库的版本兼容等问题,建议使用官方提供的 create-nuxt-app 新建一个标准的nuxtjs项目,然后再将原有Vue项目代码迁移过来.
创建一个新的Nuxtjs项目:
npx create-nuxt-app <项目名>
# 或
yarn create nuxt-app <项目名>
创建好新的Nuxtjs项目后,补充项目目录结构,大致如下:
标注了基本结构,不一定所有结构都会用到,根据项目的不同情况进行使用。 Nuxtjs项目创建完成,建立好相应的目录结构以后,就可以把对应Vue项目里的代码迁移到Nuxtjs项目中。 大部分的页面和组件都比较好迁移,直接复制拷贝就可以,但如果涉及到路由和状态管理,需要特别处理,在介绍之前先看下Nuxtjs的配置文件.
先看下nuxt.config.js文件的基本结构,如下代码:
export default {
target: '',
srcDir: '',
head: {
title: '',
htmlAttrs: { lang: 'en' },
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: '' },
{ name: 'format-detection', content: 'telephone=no' }
],
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
},
css: [],
plugins: [],
components: true,
buildModules: [],
modules: [],
build: {}
}
各个配置项对应不同的功能:
server
(服务端渲染)和 static
(静态化站点) src
下,这里就配置 ./src
assets/style/reset.less
@nuxtjs/axios
、 @nuxtjs/router
等 关于路由,正常情况下,Nuxtjs会依据页面目录(pages)结构自动生成路由配置。 但如果需要在项目中自定义添加较复杂的路由,可以使用 @nuxtjs/router 模块进行处理:
npm install @nuxtjs/router
。 modules: ['@nuxtjs/router']
。 router.js
,用于处理路由。 关于状态管理,可以直接在根目录结构下使用store目录,Nuxtjs会自动找到store目录,并引用 Vuex 模块,构建整个项目的状态管理。 这个过程和单独的Vue项目大致一样,只不过不用在代码里引入store文件,其他使用方式也一样:
import { mapGetters, createNamespacedHelpers } from 'vuex'
const { mapMutations } = createNamespacedHelpers('config')
export default {
computed: {
...mapGetters([
'isHad'
])
},
methods: {
...mapMutations([
'setConfig',
'initConfig'
])
}
}
也可以使用 $store 进行操作:
this.$store.dispatch('config/setConfig', {})
接下来,看下package.json的命令脚本,Nuxtjs常用的scripts命令语句:
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start",
"generate": "nuxt generate"
}
其中, npm run build 用于服务端渲染; npm run generate 用于静态化站点。 基于此,在这里解释下这些语句,简单看看每些语句执行后,做了什么:
npm run dev
单独执行,会生成根目录下的 .nuxt
目录,但该目录下不包括 dist
目录 npm run build
也会生成根目录下的 .nuxt
目录,该目录包含 dist
、 dist\client
、 dist\server
npm run generate
target: 'static'
, 则只会生成根目录下的 dist
目录,包含所有静态资源 target
, 则除了会生成根目录下的 .nuxt
目录(包含 dist
、 dist\client
、 dist\server
),还生成根目录下的 dist
目录(包含静态资源) npm run start
需要搭配 build
、 generate
命令一起使用:
build
再执行 start
,则使用 .nuxt
目录的内容, target
被设置成 server
generate
再执行 start
,则使用 dist
目录的内容 nuxt.config.js
配置中的 target: 'static'
,则 start
必须和 generate
一起使用 Nuxtjs存在两个环境,一个用于运行服务端,一个用于运行客户端,通过环境变量可以进行区分。 下面,看下Nuxtjs中的 process 几个环境变量:
npm run generate
生成,为true则是,为false则否 如果 nuxt.config.js 中的 target: 'static' ,则 npm run dev 、 npm run build 、 npm run generate 中的 process.static 都是 true .
process.client/process.server 是在执行打包命令的时候进行转换的,这个时候会把服务端和客户端的代码分开打包,服务端的代码在node环境中执行,客户端的代码一般在浏览器中执行.
它们的存在,对我们处理一些问题很有用,如只能在客户端环境下执行的代码要做区分(window、document等):
if (process.client) {
document.addEventListener('click', (e) => {})
window.addEventListener('resize', () => {}, false)
}
如上代码,当使用了 process.client 进行判断后,这部分代码将只会打包在客户端,就不会出现找不到对象的错误了.
有了以上关于Nuxtjs的介绍,特别是脚本命令,我们就能很容易搞定Nuxtjs的部署了。 Nuxtjs在部署上有三种方式:服务端渲染部署、静态化站点部署、单页面应用部署.
设置nuxt.config.js:
target: 'server'
执行打包命令:
npm run build
执行命令后,将会在根目录下生成一个 .nuxt 的目录.
当我们要在服务器上进行部署的时候,需要将Nuxtjs项目下的 .nuxt目录、static目录、nuxt.config.js、package.json 四个资源拷贝到服务器上。 在服务器上直接启动,则执行以下命令:
# 安装包:
npm run install
# 启动:
npm run start
如果用PM2来启动,也是先安装包: npm run install 。 然后,可以新建一个PM2的启动配置文件 ecosystem.json :
{
"app": [{
"name": "appWeb",
"script": "./node_modules/nuxt/bin/nuxt.js"
}]
}
配置好 script 启动脚本,直接启动即可:
pm2 start ecosystem.json
设置nuxt.config.js:
target: 'static'
执行打包命令:
npm run generate
生成的静态文件位于根目录的 dist 目录(默认)下,直接将该文件拷贝web服务器上即可.
生成静态文件时,会把pages下的每个页面都生成一个对应的html页面,但如果遇到该html页面上的js无效的情况,需要特殊处理。 我在处理nuxtjs项目,进行静态化导出的时候就碰到了JS无法执行的问题,最后使用在 layouts 布局页面中进行页面处理才解决问题,具体如下:
layouts
布局页面获取路由path值: toPath: this.$route.path
;
import page1 from '../pages/page1'
import page2 from '../pages/page2'
<div class="layouts">
<pp-header/>
<page1 v-if="toPath.includes('page1')"/>
<page1 v-if="toPath.includes('page1')"/>
<pp-footer/>
</div>
通过路由字符串判断,获取当前路由信息,使用组件的方式加载对应的页面。 这样处理后,在使用 npm run generate 进行静态化打包时,也会把对应页面的内容替换进去。 最后生成html页面,浏览器打开后JS都能执行.
而直接使用 <nuxt/> 虽然页面内容效果一样,但JS却无法执行.
设置nuxt.config.js:
mode: 'spa'
执行打包命令:
npm run build
这时候会自动生成dist文件夹目录,部署到服务器上即可.
最后此篇关于Nuxtjs实现服务端渲染和静态化站点的文章就讲到这里了,如果你想了解更多关于Nuxtjs实现服务端渲染和静态化站点的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个使用 css 列的下拉菜单,当我使用 jquery slide() 时,它会调整下拉框的大小,并重排内容直到达到完整高度。 这是一个工作示例 https://codepen.io/peterg
我有一个带有嵌套 ScrollViewer 的 Expander,如下所示: 代码(简化版)
我想在所有 ajax 调用之后调用一些 javascript 函数。我知道如何调用每个单独的 ajax 调用中的函数,如下所示: function xyz() { if (window.XMLHttp
我想将值从应用程序端传递到 api。在此 api 调用中传递图像、名字、电子邮件、电话和位置。在 Debug模式下,检查值不会被传递。 代码下方 File file = null;
我正在尝试在使用reportlab生成的pdf中的表格后插入分页符,我正在使用以下函数生成pdf: def render_to_pdf(template_src, context_dict): t
CBPeripheralManager 是否有推荐的方法来终止连接。到目前为止我发现的最好的方法就是干脆不响应动态值,然后 BLE 堆栈似乎关闭了连接,但这似乎很粗糙。 一定有更好的方法吗? 最佳答案
我的 API 的 REST 端位于以下地址:http://test.jll.aplikacje-dedykowane.pl/rest/warehouse/all 。现在,我尝试返回在此页面准备的 JS
我有以下 CPP 代码。我想做的是,当我的 native 端发生错误时,我会通知 Java 该错误。我用了How can I catch SIGSEGV (segmentation fault) an
限制对象的方法之一是像这样给函数添加限制 def ten_objects(): obj = Model.objects.all()[0:10] # limit to 10 retur
我目前在电信公司实习,这是一个专业,也是本科生。我有很多选择。据我所知,我知道独立应用程序端的 c、c++、c#、java 语言,在移动端我尝试进入 android 世界,也知道 php、mysql、
我想让我的边框底部看起来像这样: 有一个 flex 的末端。目前它看起来像这样: 我尝试使用的 CSS 是 border-bottom-right-radius: 10px;。代码如下所示:
我有一个 Flutter 项目,突然间,据我所知,我没有做任何特别的事情..Android 端开始显示错误,我完全迷路了,我完全不知道哪里出了问题,也不知道为什么会这样。 这就是我打开 android
我有一个自定义对象列表 (List) 。我需要将此数据发送到 React Native 端以显示在平面列表中。我该怎么做?这个列表出现在 类 NativeToReact(reactContext:Re
我有这个代码: #if defined(NOT_STANDALONE) JNIEXPORT void JNICALL sumTraces (JNIEnv* env, jclass caller,
我有一个定义一对多模型关系的 Django 应用程序。模型如下所示: from django.db import models # Create your models here. class Str
我有以下代码,它根据 IFrame 内容的大小调整 IFrame 的大小: function setIframeHeight(id) {
如何创建自定义过滤器 angularjs javascript Controller 端?我想通过 SegmentId 在名为段的数组中搜索,以创建过滤器,该过滤器通过 SegmentId 在段数组搜
我的代码在 netbeans 8.0.2 中我几乎尝试了所有方法,但没有结果。请帮助我。如何在 netbeans 中显示它? 最佳答案 您只需单击源包(源文件),它就会显示您的项目文件。 关于java
我想这是纯 C++ 问题和 OpenGL 问题之间的一种交叉。我有一个统一的缓冲区,并在其中分配 sizeof(ShaderData) 字节的空间。我在着色器的 GPU 端使用 std140 布局。
我对 Hadoop 中 reduce 端的文件合并过程的理解有问题,因为它在“Hadoop:权威指南”(Tom White)中有所描述。引用它: When all the map outputs ha
我是一名优秀的程序员,十分优秀!