使用脚手架工具 create-nuxt-app 快速建立css
npx create-nuxt-app <项目名>
npx create-nuxt-app <项目名> html
执行一些选择前端
修改 pages/index.vuevue
<h1 class="title">Hello world</h1>
在 localhost:3000 能够看到更新效果node
|-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build |-- assets // 用于组织未编译的静态资源入LESS、SASS 或 JavaScript |-- components // 用于本身编写的Vue组件,好比滚动组件,日历组件,分页组件 |-- layouts // 布局目录,用于组织应用的布局组件,不可更改。 |-- middleware // 用于存放中间件 |-- pages // 用于存放写的页面,咱们主要的工做区域 |-- plugins // 用于存放JavaScript插件的地方 |-- static // 用于存放静态资源文件,好比图片 |-- store // 用于组织应用的Vuex 状态管理。 |-- .editorconfig // 开发工具格式配置 |-- .eslintrc.js // ESLint的配置文件,用于检查代码格式 |-- .gitignore // 配置git不上传的文件 |-- nuxt.config.json // 用于组织Nuxt.js应用的个性化配置,已覆盖默认配置 |-- package-lock.json // npm自动生成,用于帮助package的统一性设置的,yarn也有相同的操做 |-- package-lock.json // npm自动生成,用于帮助package的统一性设置的,yarn也有相同的操做 |-- package.json // npm包管理配置文件
别名 | 目录 |
---|---|
~ 或 @ | srcDir |
~~ 或 @@ | rootDir |
在您的 vue 模板中, 若是你须要引入 assets 或者 static 目录, 使用 ~/assets/your_image.png 和 ~/static/your_image.png 方式。webpack
在根目录下的 package.json 里对 config 项进行配置ios
"config":{ "nuxt":{ "host":"127.0.0.1", "port":"1818" } },
定义一个全局的 CSS 来初始化咱们的页面渲染,这里使用 normailze.css。git
新建 assets/css/normalize.cssgithub
修改 nuxt.config.jsweb
css: ["element-ui/lib/theme-chalk/index.css", "~assets/css/normailze.css"],
在 nuxt.config.js 中能够对 webpack 配置进行覆盖
build: { loaders:[ { test:/\.(png|jpe?g|gif|svg)$/, loader:"url-loader", query:{ limit:10000, name:'img/[name].[hash].[ext]' } } ], /* ** Run ESLint on save */ extend (config, { isDev, isClient }) { if (isDev && isClient) { config.module.rules.push({ enforce: 'pre', test: /\.(js|vue)$/, loader: 'eslint-loader', exclude: /(node_modules)/ }) } } }
编写一个测试 demo (找个网站抄抄),来看看基本流程
npm install iview --save 或 vue add iview (须要vue-cli支持)
想要加入其它的配置,能够在 nuxt.config.js 的 plugins 配置项中加入,同时在 plugins 文件夹下加入引入逻辑。例如:
nuxt.config.js
{src: '~plugins/iview', ssr: true}
同时新建 plugins/iview.js
import Vue from 'vue' import iView from 'iview' Vue.use(iView) import 'iview/dist/styles/iview.css'
可经过添加 layouts/default.vue 文件来扩展应用的默认布局
<template> <div class="layout"> ...... </div> </template>
传统的 spa 使用的
,但在 nuxtjs 中使用 组件显示页面的主体内容.created 和 data 中的逻辑,是在服务端加载时处理的,并非浏览器端,浏览器端的逻辑好比 window 或 location 等对象要在 mounted 中写,不然会报错.head 中定义一些元数据,这些元数据会被爬虫抓取到,能够在每个页面中自定义.
网上随便下张图片,而后新建 pages/index
<template> <div class="container"> <div> <Card v-for="i in 5" :key="i" :style="{width:'100%',marginBottom:'15px'}"> <div style="text-align:center"> <img src="~/static/image/cat.jpg" height="300px" /> <h3>A high quality UI Toolkit based on Vue.js</h3> </div> </Card> </div> </div> </template>
@和~均可以用来引入图片
nuxt 中的基础路由是根据 pages 的目录结构来生成的.例如 pages/index.vue 就是{name:'index',path:'/',component:'pages/index.vue'}, 同理 pages/books/index.vue 就是{name:'books',path:'/books',component:'pages/books/index.vue'}
修改 layout/default.vue
<Menu mode="horizontal" theme="dark" active-name="1"> <div class="layout-logo"></div> <div class="layout-nav"> <MenuItem name="1"> <Icon type="ios-navigate"></Icon> <nuxt-link to="/">首页</nuxt-link> </MenuItem> <MenuItem name="2"> <Icon type="ios-keypad"></Icon>发现 </MenuItem> <MenuItem name="3"> <nuxt-link to="/books">小书</nuxt-link> </MenuItem> </div> </Menu>
Nuxt.js 推荐nuxt-link标签来构建路由体系
使用 asyncData 的方法,使得咱们能够在设置组件的数据以前能异步获取或处理数据。asyncData 方法会在组件(限于页面组件)每次加载以前被调用。它能够在服务端或路由更新以前被调用。 在这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,你能够利用 asyncData 方法来获取数据,Nuxt.js 会将 asyncData 返回的数据融合组件 data 方法返回的数据一并返回给当前组件。因为 asyncData 方法是在组件 初始化 前被调用的,因此在方法内是没有办法经过 this 来引用组件的实例对象。
npm install axios --save
在http://myjson.com/上建立假伪数据
{ "data": [ { "name": "Cesium基础功能-鹰眼地图。附带源码下载" }, { "name": "iOS开发简记(7):网络请求模块" }, { "name": "iOS开发简记(7):网络请求模块" }, { "name": "(难度Hard) Problem 132. Palindrome Partitioning II(回文串拆分II)" }, { "name": "iOS 13适配问题" }, { "name": "Cesium基础功能-气泡弹窗。附带源码下载" }, { "name": "重学安卓:是让人耳目一新的 Jetpack MVVM 精讲啊!" }, { "name": "iOS开发简记(6):storyboard的使用" }, { "name": "最熟悉的陌生人:5 分钟快速理解 HTTP2" } ] }
复制粘贴,点击保存,获取地址https://api.myjson.com/bins/f1bdx
新建 pages/index.vue
<template> <div class="container"> <div> <Card v-for="(item,index) in books" :key="index" :style="{width:'100%',marginBottom:'15px'}"> <div style="text-align:center"> <img src="~/static/image/cat.jpg" height="300px" /> <h3>{{ item.name }}</h3> </div> </Card> </div> </div> </template> <script> import axios from 'axios' export default { async asyncData(){ let {data}=await axios.get('https://api.myjson.com/bins/f1bdx') return {info: data} } } </script>
Nuxt.js 为页面提供的特殊配置项。其中 head 配置当前页面的 Meta 标签, 详情参考 页面头部配置 API。
head: { title: '一本书 - 首页', meta: [ { hid: 'description', name: 'description', content: 'website description' }, { name: 'keywords', content: '一本书,码农,技术,vue,node,nuxt,前端' } ] },
打开网页->刷新->右键查看,效果就显示出来了,这也是 nuxt 的一大优势
全局动画默认使用 page 来进行设置,例如如今咱们为每一个页面都设置一个进入和退出时的渐隐渐现的效果。咱们能够先在根目录的 assets/css 下创建一个 main.css 文件。
.page-enter-active, .page-leave-active { transition: opacity 2s; } .page-enter, .page-leave-active { opacity: 0; }
而后在 nuxt.config.js 里加入一个全局的 css 文件就能够了。
css:['assets/css/main.css'],
目前官方设定nuxt-link组件制做跳转连接才有动画
修改 pages/books/index.vue
<Row type="flex" gutter="10" justify="start" class="code-row-bg"> <Col v-for="i in 10" :key="i" span="6"> <Card style="width:100%"> <nuxt-link :to="'/books/'+i"> <div style="text-align:center"> <img style="width:100%" src="https://img3.doubanio.com/view/subject/m/public/s6974202.jpg" /> <h3>史蒂夫·乔布斯传</h3> </div> </nuxt-link> </Card> </Col> </Row>
在 Nuxt.js 里面定义带参数的动态路由,须要建立对应的如下划线做为前缀的 Vue 文件 或 目录。也就是要么建立_id.vue,要么建立_id/index.vue
新建 pages/books/_id.vue
<template> <div> <Card style="width:100%"> <div style="text-align:center"> <img style="width:100%" src="https://img3.doubanio.com/view/subject/m/public/s6974202.jpg" /> <h3>史蒂夫·乔布斯传</h3> <p>当前id : {{ id }}</p> </div> </Card> </div> </template> <script> export default { validate({ params }) { return /^[0-9]+$/.test(params.id) }, data() { return { id: this.$route.params.id } }, head() { return { title: '史蒂夫·乔布斯传', meta: [{ hid: 'description', name: 'books', content: '史蒂夫·乔布斯传' }] } } } </script>
Nuxt.js 容许你在 nuxt.config.js 里定义应用所需的全部默认 meta 标签,在 head 字段里配置就能够了
新建 root/app.html
<!DOCTYPE html> <html lang="en"> <head> {{ HEAD }} </head> <body> {{ APP }} </body> </html>
nuxt 实际上已经将开发的一些需求都准备好了,使用 nuxt 进行 vue 服务端渲染可以极大的提升开发效率
静态应用部署
npm run generate
参考