Abstract
- single repositoryで複数のprojectを管理する
- ビルド時に
nuxt.config.js
を上書きし,pages
をproject毎に分離
Motivation
admin
とuser
で共通のコンポーネントがある/user
,/admin
のようにルーティングで分ける方法もあるが, そもそも/admin
を外に出したくない(同じ環境で動作させたくない)
1. setup subdir
create-nuxt-appで生成したテンプレートを元に, admin/
ディレクトリ配下にサブプロジェクトを作成する.
$ mkdir -p admin/{pages,layouts}
$ touch admin/app.config.js
$ls
.gitignore
.nuxt/
admin/ <-- new
layouts/
pages/
app.config.js
assets/
components/
...
layouts/ <-- default
pages/ <-- default
2. configure app.config.js
srcDir
をadmin
とすることで, Nuxtがみるプロジェクトがadmin/
配下になる.
これでNuxtが生成するroutingもadmin/pages
によるものになる.
そのため, Storeをadmin側でも持ちたい場合はadmin/store/
を作成する.
また, admin/pages/xxx.vue
でもimport XXX from '@/components/...
のように@
を用いる為にbuild
ディレクティブで@ alias
を上書きする.
(この設定がない場合, @/../components/...
のように root directoryまで1階層のぼる必要がある)
const path = require('path')
const merge = require('deepmerge')
const nuxt = require('../nuxt.config.js')
const extend = {
srcDir: __dirname,
buildDir: '.nuxt/admin',
build: {
extend(config) {
config.resolve.alias['@'] = path.resolve(__dirname, '..')
}
}
}
export default merge(nuxt, extend)
3. configure package.json
nuxt
の--config-file
オプションを用いてnuxt.config.js
を指定する.
これでyarn dev
とすればデフォルトのpages
が用いられるし, yarn dev:admin
とすればadmin/pages
が用いられる.
{
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start",
"dev:admin": "nuxt --config-file admin/app.config.js",
"build:admin": "nuxt build --config-file admin/app.config.js",
"start:admin": "nuxt start --config-file admin/app.config.js",
},
...
}
Appendix: Generated Routing(.nuxt/admin/router.js)
yarn build:admin
で生成されたroutes
に client
側のpages
が含まれていないことが確認できる.
import Vue from 'vue'
import Router from 'vue-router'
import { interopDefault } from './utils'
import scrollBehavior from './router.scrollBehavior.js'
const _0510df08 = () => interopDefault(import('../../admin/pages/index.vue' /* webpackChunkName: "pages/index" */))
Vue.use(Router)
export const routerOptions = {
mode: 'history',
base: decodeURI('/'),
linkActiveClass: 'nuxt-link-active',
linkExactActiveClass: 'nuxt-link-exact-active',
scrollBehavior,
routes: [{
path: "/",
component: _0510df08,
name: "index"
}],
fallback: false
}
export function createRouter() {
return new Router(routerOptions)
}
Comments