• 插件
    • 使用第三方模块
    • 使用 Vue 插件
      • ES6 插件
    • 注入 $root 和 context
      • 注入 Vue 实例
      • 注入 context
      • 同时注入
    • 只在客户端使用的插件
      • 传统命名插件

    插件

    Nuxt.js允许您在运行Vue.js应用程序之前执行js插件。这在您需要使用自己的库或第三方模块时特别有用。

    需要注意的是,在任何 Vue 组件的生命周期内, 只有 beforeCreatecreated 这两个方法会在 客户端和服务端被调用。其他生命周期函数仅在客户端被调用。

    使用第三方模块

    我们可以在应用中使用第三方模块,一个典型的例子是在客户端和服务端使用 axios 做 HTTP 请求。

    首先我们需要安装 npm 包:

    1. npm install --save axios

    然后,在页面内这样使用:

    1. <template>
    2. <h1>{{ title }}</h1>
    3. </template>
    4. <script>
    5. import axios from 'axios'
    6. export default {
    7. async asyncData ({ params }) {
    8. let { data } = await axios.get(`https://my-api/posts/${params.id}`)
    9. return { title: data.title }
    10. }
    11. }
    12. </script>

    使用 Vue 插件

    假如我们想使用 vue-notifications 显示应用的通知信息,我们需要在程序运行前配置好这个插件。

    首先增加文件 plugins/vue-notifications.js

    1. import Vue from 'vue'
    2. import VueNotifications from 'vue-notifications'
    3. Vue.use(VueNotifications)

    然后, 在 nuxt.config.js 内配置 plugins 如下:

    1. module.exports = {
    2. plugins: ['~/plugins/vue-notifications']
    3. }

    想了解更多关于 plugins 的配置,请参考 插件 API 文档。

    ES6 插件

    如果插件位于node_modules并导出模块,需要将其添加到transpile构建选项:

    1. module.exports = {
    2. build: {
    3. transpile: ['vue-notifications']
    4. }
    5. }

    您可以参考 构建配置 文档来获取更多构建选项。

    注入 $root 和 context

    有时您希望在整个应用程序中使用某个函数或属性值,此时,你需要将它们注入到Vue实例(客户端),context(服务器端)甚至 store(Vuex)。按照惯例,新增的属性或方法名使用$作为前缀。

    注入 Vue 实例

    将内容注入Vue实例,避免重复引入,在Vue原型上挂载注入一个函数,所有组件内都可以访问(不包含服务器端)。

    plugins/vue-inject.js:

    1. import Vue from 'vue'
    2. Vue.prototype.$myInjectedFunction = (string) => console.log("This is an example", string)

    nuxt.config.js:

    1. export default {
    2. plugins: ['~/plugins/vue-inject.js']
    3. }

    这样,您就可以在所有Vue组件中使用该函数。

    example-component.vue:

    1. export default {
    2. mounted(){
    3. this.$myInjectedFunction('test')
    4. }
    5. }

    注入 context

    context注入方式和在其它vue应用程序中注入类似。

    plugins/ctx-inject.js:

    1. export default ({ app }, inject) => {
    2. // Set the function directly on the context.app object
    3. app.myInjectedFunction = (string) => console.log('Okay, another function', string)
    4. }

    nuxt.config.js:

    1. export default {
    2. plugins: ['~/plugins/ctx-inject.js']
    3. }

    现在,只要您获得context,你就可以使用该函数(例如在asyncDatafetch中)。ctx-example-component.vue:

    1. export default {
    2. asyncData(context){
    3. context.app.myInjectedFunction('ctx!')
    4. }
    5. }

    同时注入

    如果您需要同时在contextVue实例,甚至Vuex中同时注入,您可以使用inject方法,它是plugin导出函数的第二个参数。将内容注入Vue实例的方式与在Vue应用程序中进行注入类似。系统会自动将$添加到方法名的前面。

    plugins/combined-inject.js:

    1. export default ({ app }, inject) => {
    2. inject('myInjectedFunction', (string) => console.log('That was easy!', string))
    3. }

    nuxt.config.js:

    1. export default {
    2. plugins: ['~/plugins/combined-inject.js']
    3. }

    现在您就可以在context,或者Vue实例中的this,或者Vuexactions/mutations方法中的this来调用myInjectedFunction方法。ctx-example-component.vue:

    1. export default {
    2. mounted(){
    3. this.$myInjectedFunction('works in mounted')
    4. },
    5. asyncData(context){
    6. context.app.$myInjectedFunction('works with context')
    7. }
    8. }

    store/index.js:

    1. export const state = () => ({
    2. someValue: ''
    3. })
    4. export const mutations = {
    5. changeSomeValue(state, newValue) {
    6. this.$myInjectedFunction('accessible in mutations')
    7. state.someValue = newValue
    8. }
    9. }
    10. export const actions = {
    11. setSomeValueToWhatever ({ commit }) {
    12. this.$myInjectedFunction('accessible in actions')
    13. const newValue = "whatever"
    14. commit('changeSomeValue', newValue)
    15. }
    16. }

    只在客户端使用的插件

    不支持ssr的系统,插件只在浏览器里使用,这种情况下下,你可以用 ssr: false ,使得插件只会在客户端运行。

    举个例子:

    nuxt.config.js:

    1. module.exports = {
    2. plugins: [
    3. { src: '~/plugins/vue-notifications', ssr: false }
    4. ]
    5. }

    plugins/vue-notifications.js:

    1. import Vue from 'vue'
    2. import VueNotifications from 'vue-notifications'
    3. Vue.use(VueNotifications)

    您可以通过检测process.server这个变量来控制插件中的某些脚本库只在服务端使用。当值为 true 表示是当前执行环境为服务器中。此外,可以通过检查process.static是否为true来判断应用是否通过nuxt generator生成。您也可以组合process.serverprocess.static这两个选项,确定当前状态为服务器端渲染且使用nuxt generate命令运行。

    注意:由于Nuxt.js 2.4,模式已被引入作为插件的选项来指定插件类型,可能的值是:clientserver, ssr:false 在下一个主要版本中弃用,将过渡为 mode: 'client'

    例子:

    nuxt.config.js:

    1. export default {
    2. plugins: [
    3. { src: '~/plugins/both-sides.js' },
    4. { src: '~/plugins/client-only.js', mode: 'client' },
    5. { src: '~/plugins/server-only.js', mode: 'server' }
    6. ]
    7. }

    传统命名插件

    如果假设插件仅在 客户端服务器端 运行,则 .client.js.server.js可以作为插件文件的扩展名应用,该文件将自动包含在相应客户端或者服务端上。

    例子:

    nuxt.config.js:

    1. export default {
    2. plugins: [
    3. '~/plugins/foo.client.js', // only in client side
    4. '~/plugins/bar.server.js', // only in server side
    5. '~/plugins/baz.js' // both client & server
    6. ]
    7. }