Nuxtプロジェクトのセットアップマニュアル
インストール
プロジェクトディレクトリの親ディレクトリから始める。
yarn create nuxt-app <project-name>
Uses a custom server framework > express
Choose features to install > Progressive Web App(PWA) Support, Linter / Formatter, Prettier, Axios
Use a custom UI framework > bulma
Use a custom test framework > ava
Choose rendering mode > Universal
Choose a package manager > yarn
cd <project-name>
yarn add body-parser express-session path sqlite whatwg-getch sequelize
yarn add -D jsdom nodemon redirect-ssl sass-loader vue-eslint-parser
設定
package.json
scripts.lint
に--fix
オプションを追加scripts
にtest:update-snapshots: ava --update-snapshots
を追加
nuxt
nuxt.config.js
のbuild.extend(config, ctx)
を以下の内容に変更
if (ctx.isDev && ctx.isClient) {
config.mode = 'development' // 追加
config.module.rules.push({
enforce: 'pre',
test: /\.(js|vue)$/,
loader: 'eslint-loader',
exclude: /(node_modules)/
})
}
https
次にhttpsの設定を行う。 開発用に秘密鍵と公開鍵を作成するが、公開するときにはこれらは使わないこと
以下のコマンドでキーを作成する
openssl req -newkey rsa:2048 -nodes -keyout develop.key -x509 -days 365 -out develop.crt
nuxt.config.js
のserver
に以下のものを追記
// ...
server: {
https: {
key: fs.readFileSync(path.resolve(__dirname, 'develop.key')),
cert: fs.readFileSync(path.resolve(__dirname, 'develop.crt')),
}
},
// ...
設定しただけだとHTTPS化しないので、server/index.js
の内容を書き換える。
Node.jsのhttps
を利用する形になる。
// server/index.js
// ...
// Listen the server
//app.listen(port, host) // <- もともとあったコード
let server = https.createServer(nuxt.options.server.https, app)
server.listen(port, host)
// ...
ava
ava.config.js
ava.config.js
に以下の項目を追加。
テスト用のファイルの拡張子には.test.js
を付ける。
export default {
// ...
files: [
"test/**/*.test.js"
],
snapshotDir: "ava-snapshots",
// ...
}
jsdomを使うことによる不具合の修正
将来的には不要になるかもしれない。
test/helpers/setup.js
の末尾に次のコードを追加
// fix a overrided Date class by jsdom
// https://github.com/vuejs/vue-test-utils/issues/936
window.Date = Date
確認
ここまで来たら、動作チェックをする。
yarn test
以下のエラーが発生した時は、jsdomの設定を見直す。
TypeError: Super expression must either be null or a function
_inherits (node_modules/@vue/component-compiler-utils/node_modules/prettier/index.js:1957:11)
node_modules/@vue/component-compiler-utils/node_modules/prettier/index.js:40358:5
node_modules/@vue/component-compiler-utils/node_modules/prettier/index.js:40378:4
createCommonjsModule (node_modules/@vue/component-compiler-utils/node_modules/prettier/index.js:193:35)
Object.<anonymous> (node_modules/@vue/component-compiler-utils/node_modules/prettier/index.js:40350:18)
compile (node_modules/require-extension-hooks/src/hook.js:75:10)
hook (node_modules/require-extension-hooks/src/hook.js:32:3)
actuallyCompile (node_modules/@vue/component-compiler-utils/dist/compileTemplate.js:100:24)
compileTemplate (node_modules/@vue/component-compiler-utils/dist/compileTemplate.js:31:16)
getCompiledTemplate (node_modules/require-extension-hooks-vue/src/index.js:123:20)
成功したら、test/specs
を削除する。
サーバーサイドの拡張をするとき
yarn nuxt-app
でexpressを使用してプロジェクトを作成するとプロジェクトディレクトリにserver
というディレクトリができる。
ファイルの更新があった時自動で更新してくれるため、そのディレクトリにサーバーサイドのコードを追加していく形を取る。
ただし、server/index.js
というファイルがyarn nuxt-app
によって作られているので、混乱が生じないようにコードはserver
の子ディレクトリを新しく作ってそこに追加していく形を取る。
新しくサーバーサイドのファイルを作った時はnuxt.config.js
のserverMiddleware
にそのファイルを追加していくこと。
// ...
serverMiddleware: [
"~/server/child1/index.js",
],
// ...
以下のサーバーサイドのファイルのテンプレートを使用する。
//~/server/child1/index.js
import express from 'express'
import utils from '../utils' // server/utils.jsへのパス
app = express()
export default {
path: utils.makeMiddlewarePath(__dirname), // ディレクトリ構造にあったパスを設定する
handler: app,
}
認証機能
サーバーサイド側で認証機能を作りたいには以下の設定も追加する。
serverMiddleware: {
bodyParser.json(),
session({
secret: 'super-secret-key',
resave: false,
saveUninitialized: false,
cookie: { maxAge: 60000 }
}),
},
確認
設定が終わったら、次のコマンドが上手く動作するか確認する。
yarn dev
yarn build && yarn start