创建项目
确保安装了 npx(npx 在 NPM 版本 5.2.0 默认安装了):
$ npx create-nuxt-app <项目名>
或者用 yarn :
yarn create nuxt-app <项目名>
运行后选择一些基础配置,参考官网www.nuxtjs.cn/guide/insta…
使用scss或者less
安装sass-loader和node-sas,注意会有版本问题,所以我选择一个确保没问题的版本
npm install -D sass-loader@7.3.11 node-sass@4.13.1
安装之后就可以在vue文件中使用scss语法
配置别名
在nuxt.config.js中添加
//build 下面加一个extend
build: {
transpile: [/^element-ui/],
extend(config, ctx) {
config.resolve.alias.components = path.resolve(__dirname, 'components')
config.resolve.alias.service = path.resolve(__dirname, 'scripts/services')
config.resolve.alias.api = path.resolve(
__dirname,
'scripts/common/api/api'
)
},
},
配置环境变量
安装cross-env
npm install -S cross-env
然后修改启动命令
"dev": "cross-env NODE_ENV=dev nuxt",
"build": "cross-env NODE_ENV=pro nuxt build",
然后在项目根目录下创建一个env.js
文件
module.exports = {
// 开发环境
dev: {
NODE_ENV: 'development2',
BASE_API: '/api', // 开发服务器地址
},
// 生产环境
pro: {
NODE_ENV: 'production',
BASE_API: '//api.xxx.com', // 正式服务器地址
},
}
nuxt.config.js中加入如下代码
env: {
baseUrl: env[process.env.NODE_ENV].BASE_API,
NODE_ENV: env[process.env.NODE_ENV].NODE_ENV,
},
其他地方就可以调用了
const BASE_URL = process.env.baseUrl
配置跨域
此时请求接口会报跨域的错误,这里的配置其实跟vue-cli里面一样,只是下载一个nuxt的插件
npm install -D @nuxtjs/proxy
然后在nuxt.config.js中
modules: [
'@nuxtjs/axios',//nuxt自带的axios,可选
'@nuxtjs/proxy',
],
proxy: {
'/api/': {
target: 'http://localhost:3000/',
pathRewrite: {
'^/api/': '',
},
},
},
此时使用axios请求不会出现跨域了,但是在asyncData中使用axios会出问题
配置axios
使用@nuxt/axios
npm install -S @nuxt/axios
若选择使用nuxt/axios的话,就不会出现问题,如果要对nuxt/axios进行个性化配置的话就需要插件化
//nuxt.config.js中配置插件
plugins: [
'~/plugins/axios'
]
扩展axios
export default function ({ $axios, redirect }) {
$axios.onRequest(config => {
console.log('Making request to ' + config.url)
})
$axios.onError(error => {
const code = parseInt(error.response && error.response.status)
if (code === 400) {
redirect('/400')
}
})
}
在vue中使用
async asyncData({ app }) {
const ip = await app.$axios.$get('http://icanhazip.com')
return { ip }
}
methods: {
async fetchSomething() {
const ip = await this.$axios.$get('http://icanhazip.com')
this.ip = ip
}
}
async nuxtServerInit ({ commit }, { app }) {
const ip = await app.$axios.$get('http://icanhazip.com')
commit('SET_IP', ip)
}
// In store
{
actions: {
async getIP ({ commit }) {
const ip = await this.$axios.$get('http://icanhazip.com')
commit('SET_IP', ip)
}
}
}
更详细的可以看官方www.axios-js.com/zh-cn/docs/…
使用原始axios
安装
npm install -S axios
使用方法和平常一样,但是在asyncData
中使用时会报错
因为使用了过滤器对response
做出来,这里response
大概率会为undefined,所以会报错
Cannot read property 'status' of undefined
这时候把过滤器注释掉,再请求一遍,会发现报错不一样了
connect ECONNREFUSED 127.0.0.1:80
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1148:16)
原因是当使用asyncData方法在组件渲染前异步请求数据时,node url parse 去解析你的这个 /api 参数的,然后再传给相应的如 http request所以默认就是80端口
换句话说 asyncData方法异步请求数据时,以为/api/${params.id}这个接口的网址是 127.0.0.1:80, 所以将请求发送给了127.0.0.1:80,而我的接口服务器并没有跑在80端口上,所以报错。
解决方法有三种: 一、将nuxt的端口改成80(推荐)更正一下:这种方式适合开发环境使用,因为线上80端口会被nginx占用,做个环境变量的判断就行
//nuxt.config.js中
server: {
port: process.env.NODE_ENV === 'dev' ? 80 : 8888,
host: '0.0.0.0',
},
二、将接口的服务器端口改为80
三、将接口的url写全
将上面配置的环境变量改成,原理是直接指定接口url,nuxt就会做转发,不会产生跨域问题
dev: {
NODE_ENV: 'development',
BASE_API: 'http://localhost:3000', // 开发服务器地址
},
但这样的话要注意axios的配置中是否有些用到这个BASE_API
做为axios的BASE_URL
如果有的话要注意做一下区分,可以加一个环境变量
dev: {
NODE_ENV: 'development',
BASE_API: 'http://localhost:3000', // 开发服务器地址
PROXY_API: '/api', //
},
比如asyncData
里面调用的话就用BASE_API
,非asyncData
的话就用PROXY_API
。不过这样就有点多此一举的感觉了