我在 Nuxtjs 2.15.4 上,我正在尝试为我的应用程序创建多个主题。
流程非常简单:我有一个themes
文件夹,里面有我的主题文件夹。在 nuxt build/dev 将调用一个模块:
const path = require('path')
const chokidar = require('chokidar');
const fse = require('fs-extra');
export default async function (moduleOptions) {
// moduleOptions.themeName = 'newtheme' & moduleOptions.customizeTheme = 'false'
const themeName = moduleOptions.themeName
const defaultThemeDir = path.join(this.options.rootDir, './themes/main')
const newThemeDir = path.join(this.options.rootDir, './themes/'+moduleOptions.themeName)
const sourceDir = path.join(this.options.rootDir, './')
const emptySourceDir = async () => {
fse.emptyDir(path.join(this.options.rootDir, 'assets'))
fse.emptyDir(path.join(this.options.rootDir, 'components'))
fse.emptyDir(path.join(this.options.rootDir, 'layouts'))
fse.emptyDir(path.join(this.options.rootDir, 'middleware'))
fse.emptyDir(path.join(this.options.rootDir, 'pages'))
fse.emptyDir(path.join(this.options.rootDir, 'plugins'))
fse.emptyDir(path.join(this.options.rootDir, 'static'))
}
const copyThemesDirectory = async () => {
await fse.copy(path.join(defaultThemeDir, 'base'), sourceDir)
if(themeName !== 'main'){
await fse.copy(path.join(newThemeDir, 'base'), sourceDir)
}
if(moduleOptions.customizeTheme === 'true'){
await fse.copy(path.join(newThemeDir, 'custom'), sourceDir)
}
}
const toTargetPath = (oldPath) => {
let newPath = oldPath.replace(this.options.rootDir, '')
.replace('\\themes\\main\\base\\', '\\')
.replace('\\themes\\main\\custom\\', '\\')
.replace('\\themes\\'+themeName+'\\base\\', '\\')
.replace('\\themes\\'+themeName+'\\custom\\', '\\')
return path.join(this.options.rootDir, newPath)
}
await emptySourceDir()
await copyThemesDirectory()
if(process.env.NODE_ENV === 'development'){
chokidar.watch([defaultThemeDir, newThemeDir]).on('all', async (event, filePath) => {
if (event === 'add' || event === 'change') {
fse.copy(filePath, toTargetPath(filePath))
}
if (event === 'unlink') {
fse.remove(toTargetPath(filePath))
}
})
}
}
它将清空 nuxt 根目录中的一些文件夹,然后复制themes/main/base
到其中。之后它将检查主题名称是否不是“main”,它将复制themes/{themeName}/base
到根目录中。然后它将检查自定义选项,如果为真,它将theme/{themeName}/custom
文件夹复制到根目录。
这部分完成没有问题!第二部分是development
模式,给我这样的文件(添加到新主题或自定义的新文件)不存在的错误。
该部分在chokidar
观看我的主题文件夹的帮助下,如果有任何更改,它将删除或复制根目录中的内容。如果主主题基础文件夹中存在相同的文件,则会显示错误。
我什至尝试fse.copy(filePath, toTargetPath(filePath),{overwrite: true})
过fse.copySync(filePath, toTargetPath(filePath),{overwrite: true})
这是一个错误示例:
错误 ENOENT:没有这样的文件或目录,取消链接 '{my-local-directory}\components\global\footer\sub\links.vue'
有谁知道它有什么问题??即使只是从主题复制到根目录,它也可以在第一次尝试时运行手表change
或部件。add
#更新
看起来即使在构建中也有错误。我建造,它给了我
Error: ENOENT: no such file or directory, mkdir '/var/www/static/images/folder'
然后在我构建它时再次运行而没有错误。这是我的主题文件夹结构:
-themes
|__ main
| |__base
| | |__assets
| | |__components
| | |__middleware
| | |__layouts
| | |__pages
| | |__plugins
| | |__static
| |
| |__custom
|
|__ newtheme
|__base
|__custom