Nuxt.js 运行 生成,全局混合(...不是函数)
Nuxt.js run generate, global mixin (... is not a function)
我制作了一些全局混音,只要我发出 run dev
命令,它们就可以正常工作。
但是当我制作 run generate
时,我在控制台中收到错误“不是函数”。
类似的问题在我连接外部插件时出现在服务器上,但在开发模式下不会发生。
我尝试了不同的解决方案,但没有任何帮助。
这是我的nuxt.config(只留下基本设置用于演示)。关注plugins/seo.js
export default {
target: 'static',
srcDir: 'nuxt',
ssr: false,
plugins: [
{ src: '~plugins/nuxt-quill-plugin', ssr: false },
{ src:'~plugins/vue-final-modal.js'},
{ src: '~plugins/notifications.js', mode: 'client' },
'~plugins/persistedState.js',
'~plugins/clickOutside.js',
'~plugins/dateTimePicker.js',
'~plugins/seo.js',
"~plugins/location.js",
"~plugins/fetchData.js"
],
echo: {
plugins: [ '~/plugins/echo.js' ]
},
components: true,
modules: [
'@nuxtjs/axios',
'@nuxtjs/pwa',
'@nuxtjs/auth-next',
['@nuxtjs/laravel-echo', {
broadcaster: 'pusher',
key: 'e27d2f2173c11d7b12c7',
cluster: 'eu',
forceTLS: true,
authEndpoint: '/broadcasting/auth',
}],
'nuxt-laravel'
],
build: {
transpile: ["vue-final-modal", 'notifications', 'fetchData', 'location', 'seo', 'dom7'],
vendor: ["vue-final-modal", 'notifications', 'fetchData', 'location', 'seo', 'dom7'],
loaders: {
cssModules: {
localIdentName: '[local]', //Work
modules: false
},
css: {
localIdentName: '[local]'
}
}
},
generate: {
vendor: ["vue-final-modal", 'notifications', 'nuxt-quill-plugin', 'fetchData', 'location', 'seo', 'dom7'],
transpile: ["vue-final-modal", 'notifications', 'nuxt-quill-plugin', 'fetchData', 'location', 'seo', 'dom7'],
loaders: {
cssModules: {
localIdentName: '[local]', //Work
modules: false
},
css: {
localIdentName: '[local]'
}
}
},
}
这是我的 mixins 之一,它因错误“seoPath 不是函数”而中断。注意seoPath
方法。
import Vue from "vue"
if (!Vue.seo_dispatcher) {
Vue.seo_dispatcher = true
Vue.mixin({
head() {
return {
title: this.seoTitle,
meta: [
{
hid: 'description',
name: 'description',
content: this.seoDesc
},{
hid: 'title',
name: 'title',
content: this.seoTitle
}
]
}
},
data(){
return {
variableAliases: {
'#CITY#': 'city',
'#CITY_PRED#': 'city',
'#CITY_REGION#': 'region',
'#CITY_REGION_PRED#': 'region',
'#NAME#': 'seo',
'#MIN.PRICE#': 'min_price',
'#CATEGORY#': 'category',
'#PRODUCT#': 'product'
}
}
},
methods: {
async dispatchSeo(to){
if(this.$store){
this.$store.dispatch('router/getSeo', to)
}
},
// get city & area from store and suffix it to url
// AND get language slug and prefix it ti url
seoPath(slug){
// if router object
if(typeof slug === 'object') {
let route = this.$router.resolve(slug)
slug = route.href
}
let slash = slug.endsWith('/')? '': '/';
let url_location = [
this.$store.state.router.city.slug,
this.$store.state.router.area.slug
].filter((item) => {
return item !== null && item !== ''
});
return this.localePath(slug + slash + url_location.join('/'))
},
// get string and replace all variables with data form store using variable's aliase array
replaceVariables(string){
const reg = new RegExp('(#CITY#|#CITY_PRED#|#CITY_REGION#|#CITY_REGION_PRED#|#NAME#|#MIN.PRICE#|#CATEGORY#|#SUBCATEGORY#|#PRODUCT#)', 'gi');
return string.replaceAll(reg, (match) => {
let modal = this.variableAliases[match]
if(this.$store.state.router[modal] && this.$store.state.router[modal].name)
return this.$store.state.router[modal].name
else
return '';
})
}
},
computed: {
seoH1(){
if(this.$store)
if(this.$store.state.router.seo && this.$store.state.router.seo.meta_h1)
return this.replaceVariables(this.$store.state.router.seo.meta_h1)
else
return ''
},
seoTitle(){
if(this.$store)
if(this.$store.state.router.seo && this.$store.state.router.seo.meta_title)
return this.replaceVariables(this.$store.state.router.seo.meta_title)
else
return ''
},
seoDesc(){
if(this.$store)
if(this.$store.state.router.seo && this.$store.state.router.seo.meta_desc)
return this.replaceVariables(this.$store.state.router.seo.meta_desc)
else
return ''
},
seoText(){
if(this.$store)
if(this.$store.state.router.seo && this.$store.state.router.seo.meta_text)
return this.replaceVariables(this.$store.state.router.seo.meta_text)
else
return ''
}
}
})
}
我发现 plugins
目录中的文件没有编译到项目的构建文件中,而是保留为插件目录中文件的链接。在我的例子中,该项目建立在 nuxt 文件夹之外的目录中,因此无法访问插件文件夹中的文件。
将项目构建路径移动到 nuxt 目录中解决了问题。
我制作了一些全局混音,只要我发出 run dev
命令,它们就可以正常工作。
但是当我制作 run generate
时,我在控制台中收到错误“不是函数”。
类似的问题在我连接外部插件时出现在服务器上,但在开发模式下不会发生。
我尝试了不同的解决方案,但没有任何帮助。
这是我的nuxt.config(只留下基本设置用于演示)。关注plugins/seo.js
export default {
target: 'static',
srcDir: 'nuxt',
ssr: false,
plugins: [
{ src: '~plugins/nuxt-quill-plugin', ssr: false },
{ src:'~plugins/vue-final-modal.js'},
{ src: '~plugins/notifications.js', mode: 'client' },
'~plugins/persistedState.js',
'~plugins/clickOutside.js',
'~plugins/dateTimePicker.js',
'~plugins/seo.js',
"~plugins/location.js",
"~plugins/fetchData.js"
],
echo: {
plugins: [ '~/plugins/echo.js' ]
},
components: true,
modules: [
'@nuxtjs/axios',
'@nuxtjs/pwa',
'@nuxtjs/auth-next',
['@nuxtjs/laravel-echo', {
broadcaster: 'pusher',
key: 'e27d2f2173c11d7b12c7',
cluster: 'eu',
forceTLS: true,
authEndpoint: '/broadcasting/auth',
}],
'nuxt-laravel'
],
build: {
transpile: ["vue-final-modal", 'notifications', 'fetchData', 'location', 'seo', 'dom7'],
vendor: ["vue-final-modal", 'notifications', 'fetchData', 'location', 'seo', 'dom7'],
loaders: {
cssModules: {
localIdentName: '[local]', //Work
modules: false
},
css: {
localIdentName: '[local]'
}
}
},
generate: {
vendor: ["vue-final-modal", 'notifications', 'nuxt-quill-plugin', 'fetchData', 'location', 'seo', 'dom7'],
transpile: ["vue-final-modal", 'notifications', 'nuxt-quill-plugin', 'fetchData', 'location', 'seo', 'dom7'],
loaders: {
cssModules: {
localIdentName: '[local]', //Work
modules: false
},
css: {
localIdentName: '[local]'
}
}
},
}
这是我的 mixins 之一,它因错误“seoPath 不是函数”而中断。注意seoPath
方法。
import Vue from "vue"
if (!Vue.seo_dispatcher) {
Vue.seo_dispatcher = true
Vue.mixin({
head() {
return {
title: this.seoTitle,
meta: [
{
hid: 'description',
name: 'description',
content: this.seoDesc
},{
hid: 'title',
name: 'title',
content: this.seoTitle
}
]
}
},
data(){
return {
variableAliases: {
'#CITY#': 'city',
'#CITY_PRED#': 'city',
'#CITY_REGION#': 'region',
'#CITY_REGION_PRED#': 'region',
'#NAME#': 'seo',
'#MIN.PRICE#': 'min_price',
'#CATEGORY#': 'category',
'#PRODUCT#': 'product'
}
}
},
methods: {
async dispatchSeo(to){
if(this.$store){
this.$store.dispatch('router/getSeo', to)
}
},
// get city & area from store and suffix it to url
// AND get language slug and prefix it ti url
seoPath(slug){
// if router object
if(typeof slug === 'object') {
let route = this.$router.resolve(slug)
slug = route.href
}
let slash = slug.endsWith('/')? '': '/';
let url_location = [
this.$store.state.router.city.slug,
this.$store.state.router.area.slug
].filter((item) => {
return item !== null && item !== ''
});
return this.localePath(slug + slash + url_location.join('/'))
},
// get string and replace all variables with data form store using variable's aliase array
replaceVariables(string){
const reg = new RegExp('(#CITY#|#CITY_PRED#|#CITY_REGION#|#CITY_REGION_PRED#|#NAME#|#MIN.PRICE#|#CATEGORY#|#SUBCATEGORY#|#PRODUCT#)', 'gi');
return string.replaceAll(reg, (match) => {
let modal = this.variableAliases[match]
if(this.$store.state.router[modal] && this.$store.state.router[modal].name)
return this.$store.state.router[modal].name
else
return '';
})
}
},
computed: {
seoH1(){
if(this.$store)
if(this.$store.state.router.seo && this.$store.state.router.seo.meta_h1)
return this.replaceVariables(this.$store.state.router.seo.meta_h1)
else
return ''
},
seoTitle(){
if(this.$store)
if(this.$store.state.router.seo && this.$store.state.router.seo.meta_title)
return this.replaceVariables(this.$store.state.router.seo.meta_title)
else
return ''
},
seoDesc(){
if(this.$store)
if(this.$store.state.router.seo && this.$store.state.router.seo.meta_desc)
return this.replaceVariables(this.$store.state.router.seo.meta_desc)
else
return ''
},
seoText(){
if(this.$store)
if(this.$store.state.router.seo && this.$store.state.router.seo.meta_text)
return this.replaceVariables(this.$store.state.router.seo.meta_text)
else
return ''
}
}
})
}
我发现 plugins
目录中的文件没有编译到项目的构建文件中,而是保留为插件目录中文件的链接。在我的例子中,该项目建立在 nuxt 文件夹之外的目录中,因此无法访问插件文件夹中的文件。
将项目构建路径移动到 nuxt 目录中解决了问题。