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