2019/03/25に開催のサポーターズCoLabイベントの説明資料です。
公式ページのインストール手順に沿って行っていきます。
今回は簡単に行うため、npx
を使用します。
npm(Node Package Manager)のバージョンを確認します
npm -v
5.2.0
以上が表示されればOKです。
プロジェクトを作ります。
npx create-nuxt-app ColabApp
ColabApp
はフォルダ名になるため、自分が管理しやすい名前を設定してください。
()の中身から変更しない場合はそのままEnterキーを押下しましょう。
? Project name (ColabApp)
()の中身から変更しない場合はそのままEnterキーを押下しましょう。
? Project description (My grand Nuxt.js project)
今回はNuxt.jsを使用するため、None
を選択し、Enterキーを押下します。
? Use a custom server framework (Use arrow keys)
❯ none
express
koa
adonis
hapi
feathers
micro
(Move up and down to reveal more choices)
複数選択することも可能ですが、今回は Progressive Web App (PWA) Support
のみを選択します。
? Choose features to install (Press <space> to select, <a> to
toggle all, <i> to invert selection)
❯◯ Progressive Web App (PWA) Support
◯ Linter / Formatter
◯ Prettier
◯ Axios
それぞれの機能をざっくり説明すると下記のようになります。
-
Progressive Web App (PWA) Support
- ウェブとアプリの利点を備えたPWAのサポート。PWAの詳細ははじめてのプログレッシブ ウェブアプリ を参照ください。
-
Linter / Formatter
-
Prettier
- ソースコードを整形するツール。規定に従って強制的にソースコードを整形するため、チーム開発で導入すると恩恵を受けられると思います。
-
Axios
- HTTP通信ができるJavaScriptライブラリ。JSONの取得に利用されることが多いと思います。
このときにNone
を選んでもあとから追加することは可能です。
今回は個人的に気になっているbluma
を選択します。
? Use a custom UI framework
none
bootstrap
vuetify
❯ bulma
tailwind
element-ui
buefy
それぞれの詳細については公式ページをご確認ください。
今回はテストまでは行わないため、None
を選択します。
(品質を保証する上でテストは大切だと思います!!)
? Use a custom test framework (Use arrow keys)
❯ none
jest
ava
それぞれの詳細については公式ページをご確認ください。
今回はUniversal
を選択します。
? Choose rendering mode
❯ Universal
Single Page App
それぞれの意味は下記の通りです。
-
Universal
- クライアントもサーバーサイドもNuxtで開発をする際に使用
-
Single Page App
- クライアントサイドのみの開発をする際に使用
PCにGithubの設定を行っていると自動的にGithubのアカウントが表示されます。 今回は特に変更する理由ないため、そのままEnterキーを押下します。
? Author name (yourname)
最後にパッケージマネージャーを選択します。
今回はnpm
を選択します。
? Choose a package manager (Use arrow keys)
❯ npm
yarn
それぞれの詳細については公式ページをご確認ください。
上記までを設定するとインストールが始まります。 環境にもよるかと思いますが、インストールが完了するかと思います。
インストールが完了すると、下記がターミナル上に表示されているはずです。
To get started:
cd ColabApp
npm run dev
To build & start for production:
cd ColabApp
npm run build
npm start
先程 npx create-nuxt-app
で設定したディレクトリに移動します。
cd ColabApp
npmで起動します。
npm run dev
下記の画面が表示されれば、無事に起動しています。 ブラウザから http://localhost:3000 にアクセスしてみましょう。
╭──────────────────────────────╮
│ │
│ Nuxt.js v2.4.5 │
│ Running in development mode (universal) │
│ Memory usage: 164 MB (RSS: 287 MB) │
│ │
│ Listening on: http://localhost:3000 │
│ │
╰──────────────────────────────╯
公式ドキュメントに沿って進めていきます。
ライブラリのインストールを行うため、Ctrl
+ C
のキーを押下し、ローカル環境を止めます。
npm install vue-i18n --save
インストールに成功すると、下記が表示されます。
+ vue-i18n@8.9.0
added 1 package from 1 contributor and audited 13865 packages in 19.139s
found 0 vulnerabilities
多言語化ができるように各ファイルを作成や修正を行います。 今回はターミナルでの操作を基本として進めていきます。
フォルダ名はなんでもOKですが、今回は locales
にします。
mkdir locales
作ったlocales
フォルダに英語と日本語のファイルを作ります。
touch locales/en.json
touch locales/ja.json
英語の翻訳テキストを記述します。
{
"links": {
"home": "Home",
"about": "About",
"en": "English",
"ja": "Japanese"
},
"home": {
"title": "Hello,World!",
"introduction": "This is an introduction in English."
}
}
`
日本語の翻訳テキストを記述します。
{
"links": {
"home": "ほーむ",
"about": "あばうと",
"en": "えいご",
"ja": "にほんご"
},
"home": {
"title": "やぁ、世界!",
"introduction": "このページは日本語で設定されています"
}
}
英語と日本語のJSON構造が合っていないと、Webページ上で翻訳がきちんと表示されないため、気をつけましょう。
plugins
フォルダにファイルを作成します。
touch plugins/i18n.js
plugins/i18n.js
に記述します。
import Vue from 'vue'
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
export default ({ app, store }) => {
app.i18n = new VueI18n({
locale: store.state.locale,
fallbackLocale: 'ja',
messages: {
'ja': require('~/locales/ja.json'),
'en': require('~/locales/en.json')
}
})
app.i18n.path = (link) => {
if (app.i18n.locale === app.i18n.fallbackLocale) {
return `/${link}`
}
return `/${app.i18n.locale}/${link}`
}
}
HTTPリクエスト毎に現在の言語を設定します。
middleware
フォルダにファイルを作成します。
touch middleware/i18n.js
middleware/i18n.js
に記述します。
export default function ({ isHMR, app, store, route, params, error, redirect }) {
const defaultLocale = app.i18n.fallbackLocale
// If middleware is called from hot module replacement, ignore it
if (isHMR) return
// Get locale from params
const locale = params.lang || defaultLocale
if (store.state.locales.indexOf(locale) === -1) {
return error({ message: 'This page could not be found.', statusCode: 404 })
}
// Set locale
store.commit('SET_LANG', locale)
app.i18n.locale = store.state.locale
// If route is /<defaultLocale>/... -> redirect to /...
if (locale === defaultLocale && route.fullPath.indexOf('/' + defaultLocale) === 0) {
const toReplace = '^/' + defaultLocale + (route.fullPath.indexOf('/' + defaultLocale + '/') === 0 ? '/' : '')
const re = new RegExp(toReplace)
return redirect(
route.fullPath.replace(re, '/')
)
}
}
ストアに言語設定を行い、各ページで利用できるように設定します。
store
フォルダにファイルを作成します。
touch store/index.js
store/index.js
に記述します。
export const state = () => ({
locales: ['en', 'ja'],
locale: 'ja'
})
export const mutations = {
SET_LANG(state, locale) {
if (state.locales.indexOf(locale) !== -1) {
state.locale = locale
}
}
}
nuxt.config.js
にプラグインとライブラリの設定をします。
下記を記述します。
nuxt.config.js
に記述します。
…
plugins: [
'~/plugins/i18n.js' //追加
],
//ここから以下を追加
vendor: [
'vue-i18n'
],
router: {
middleware: 'i18n'
},
generate: {
routes: ['/', '/about', '/en', '/en/about']
} ,
…
以上で多言語化の設定は完了です🎉
Nuxt.jsでは pages
以下のディレクトリ構造がそのままURLのパス(http://domain/`ファイル名`)に対応します。
mkdir pages/_lang
_
をつけるとURLのパスから除外されます。
今回は_lang
の部分に言語名を埋め込むために設定します。
index.vue
ファイルを_lang
以下にコピーします。
cp pages/index.vue pages/_lang/index.vue
この項目は必須ではありませんが、作業を楽にするために行っています。
http://localhost:3000/ の参照ファイルを変更するため、pages/index.vue
に記述します。
<script>
import Index from '~/pages/_lang/index'
export default Index
</script>
これで http://localhost:3000/ を開いたときにpages/_lang/index.vue
が表示されるようなります。
これで基本設定が完了しました!
ここからはローカルホストを起動しながら進めていきます。
npm run dev
翻訳テキストが表示できるようにするため、該当箇所を編集します。
//
が編集前の内容です。
<template>
…
<h1 class="title">
{{ $t('home.title') }} //ColabApp
</h1>
<h2 class="subtitle">
{{ $t('home.introduction') }} //My grand Nuxt.js project
</h2>
…
</template>
言語切替を行う用のcomponents/AppHeader.vue
を作成します。
touch components/AppHeader.vue
components/AppHeader.vue
に記述します。
<template>
<header class="Header">
<div class="links">
<NuxtLink :to="$i18n.path('')">
{{ $t('links.home') }}
</NuxtLink>
<NuxtLink v-if="$i18n.locale === 'ja'" :to="`/en` + $route.fullPath">
{{ $t('links.en') }}
</NuxtLink>
<NuxtLink v-else :to="$route.fullPath.replace(/^\/[^\/]+/, '')">
{{ $t('links.ja') }}
</NuxtLink>
</div>
</header>
</template>
<script>
export default {
}
</script>
<style scoped>
</style>
今回は、日本語表示のときは英語
の切り替え、英語表示のときは日本語
切り替えが表示される分岐処理を追加しています。
先程作ったcomponents/AppHeader.vue
が常に表示されるように設定します。
layouts/default.vue
に記述します。
<template>
<div>
<AppHeader></AppHeader>/*追加*/
<nuxt />
</div>
</template>
//ここから
<script>
import AppHeader from '@/components/AppHeader.vue'
export default {
components: {
AppHeader
}
}
</script>
//ここまでを追加
<style>
</style>
layouts/default.vue
では、全ページのレイアウトを設定しています。
今回は、作成したコンポーネントAppHeader.vue
をインポートし、ヘッダーとして表示できるように設定しています。
http://localhost:3000を確認しましょう
えいご
のリンクテキストhttp://localhost:3000/enをクリックすると、設定した翻訳テキストが表示されます。
ここまでお付き合い頂き、ありがとうございました!
pages/_lang/about.vue
ページを追加して、翻訳テキストを表示してみましょう