Koji Kadomaさんのコード
-
JAVASCRIPT Vue.js 3でdayjsをグローバルに組み込む方法import { createApp } from 'vue' import App from './App.vue' import dayjs from 'dayjs'; const app = createApp(App); app.config.globalProperties.$dayjs = dayjs app.mount('#app')
-
JAVASCRIPT Vue.js 3でのmain.jsの書き方import { createApp } from 'vue' import App from './App.vue' import routes from './routes' import { store } from './stores/' const app = createApp(App); app.use(routes); app.use(store); app.mount('#app')
-
DOCKER Dropboxのdockerコンテナを立ち上げるdocker run --detach -it --restart=always --name=dropbox -e "POLLING_INTERVAL=20" -v /home/rancher/Dropbox:/opt/dropbox/Dropbox otherguy/dropbox:latest
-
JAVASCRIPT Vue.jsのコンポーネントで外部scriptをロードする方法<template> <p id="exscript"> <ins class="banner"></ins> </p> </template> <script> export default { mounted() { let scriptEl = document.createElement('script') scriptEl.setAttribute('src', 'スクリプトのURL') document.getElementById('exscript').appendChild(scriptEl) } } </script>
-
JAVASCRIPT Gridsomeコマンドを短くして使う方法{ "name": "hoge", "scripts": { "build": "gridsome build", "develop": "gridsome dev", "lint": "vue-cli-service lint", "deploy": "gridsome build && netlify deploy --dir=dist/ -p" } }
-
JAVASCRIPT Vue.jsのテンプレート内でundefinedを判定する方法<template> // OK <p v-if="!$route.params.page">1〜{{perPage}}件</p> // NG <p v-if="$route.params.page === null">1〜{{perPage}}件</p> // NG <p v-if="$route.params.page === 'undefined'">1〜{{perPage}}件</p> </template>
-
JAVASCRIPT Gridosomeに秒殺でmatomo analyticsを組み込むplugins: [ { use: 'gridsome-plugin-matomo', options: { host: 'matomoのアドレス', // https:から書くこと siteId: サイトID } } ]
-
JAVASCRIPT Gridosomeでジェネレータのmetaタグを削除する方法export default function (Vue, { router, head, isClient }) { // 省略 const gIndex = head.meta.findIndex(e => e.name === 'generator') if (gIndex !== -1) head.meta.splice(gIndex, 1) }
-
JAVASCRIPT Gridosomeで「No transformer for 'text/markdown' is installed.」と出た時の対応yarn add @gridsome/transformer-remark
-
JAVASCRIPT PWAでキャッシュを消して強制アップデートをする方法window.navigator.serviceWorker.getRegistrations() .then(registrations => { for(let registration of registrations) { registration.unregister(); } }); window.location.reload(true);
-
JAVASCRIPT Vue.jsでCSSスタイルをHTMLヘッダーのインライン化する設定module.exports = { chainWebpack: config => { config .plugin('html-inline-source') .use(require('html-webpack-inline-source-plugin')) config.plugin('html').tap(args => { args[0].inlineSource = '^(/css/.+\\.css)' return args }) } }
-
JAVASCRIPT Gitlab CI/CD/PagesでVue.jsアプリをビルド&デプロイする設定ファイルimage: node:latest pages: stage: deploy only: - master before_script: - 'yarn config set cache-folder .yarn' - 'yarn install' script: - 'yarn build' - 'mv public public_org && mv dist public' artifacts: paths: - public
-
GO HUGOで数字のフォーマット(number format)をする// langは表示中の言語。config.tomlで設定する // 直後の数字は桁数 {{lang.NumFmt 0 .Params.price}}
-
CSS3 複数行なら左寄せ、1行ならセンタリングさせるCSSコードh1{ display: flex; justify-content: center; }
-
JAVASCRIPT Dexie.jsでテーブルを作り直したい時の対応import Dexie from 'dexie'; const db = new Dexie('testDB'); async noteInit(){ await db.delete(); await db.version(1).stores({ notes: 'fileName, noteTxt', }); await db.open() },
-
GO HUGOのテンプレートで値段を整形(number format)する{{ .Params.price | lang.NumFmt 0}}
-
GO 多言語化したHUGOサイトのHTMLヘッダにlink rel="alternate"で他言語へのリンクをつける{{- if .IsTranslated -}} {{ range .Translations }} <link rel="alternate" hreflang="{{ .Language.Lang }}" href="{{ .Permalink }}" title="{{ .Language.LanguageName }}"> {{- end -}} {{- end -}}
-
GO HUGOで他言語へのリンクする{{ if .IsTranslated }} <div class="translated__box"> <ul class="tab__btn"> <li> <span class="tab__btn--item current-lang">{{ .Site.Language.LanguageName }}</span> </li> {{ range .Translations }} <li> <a class="tab__btn--item" href="{{ .Permalink }}">{{ .Language.LanguageName }}</a> </li> {{end}} </ul> </div> {{end}}
-
GO HUGOでカテゴリ一覧(Taxonomy Term)のJSONファイルを出力する--- title: Categories outputs: - html - json ---
-
JAVASCRIPT Vue.jsの子コンポーネントに簡単にclassを付与する方法// page.vue (呼び出し元) <Btn :to="'/'" :className="{active: true}">実行する!</btn> // btn.vue (受け取り側) <template> <router-link class="btn" :class="className" :to="to"><slot></slot></router-link> </template>
-
JAVASCRIPT 画像プロキシ・camoのdigestコードを生成してURLを返すスクリプトbuildImgProxyUrl: function(url){ const crypto = require('crypto'); const key = 'CAMO_KEY'; // 自分のものに置き換える const hmac = crypto.createHmac('sha1', key); const convUrl = hmac.update(url); const digest = hmac.digest('hex') const result = 'サーバーのURL' + digest + '?url=' + encodeURIComponent(url) // 自分のものに置き換える return result; }
-
JAVASCRIPT Javascriptで連想配列をPHPのforeachっぽい書き方でループを回すfor(let [key, val] of Object.entries(testObj)){ this[key] = val }
-
JAVASCRIPT Vue.jsのnameにマッチしたコンポーネントをkeep-aliveする// 以下router-viewするコンポーネントの設定 <keep-alive :include="/List/" :max="20"> <router-view/> </keep-alive> // 以下キャッシュさせるコンポーネント側の設定 <script> export default { name: "TopList", // ここにマッチする } </script>
-
JAVASCRIPT Vue.jsのmethodでsetInterval、setTimeoutを使う場合の注意点methods: { someMethod(){ setInterval(function () { console.log('30秒毎に処理') setTimeout( function() { console.log('5秒後に処理') setTimeout( function() { console.log('4秒後に処理') }.bind(this), 4000 ); }.bind(this), 5000 ); }.bind(this), 30000) },
-
JAVASCRIPT Vue.jsのSPAでページ遷移時にEventListenerを登録・解除するexport default { beforeMount () { window.addEventListener('scroll', this.scrollHandler); }, beforeDestroy () { window.removeEventListener('scroll', this.scrollHandler); }, }
-
JAVASCRIPT v-forで要素の連番をつける<template> <div v-for="data in List" :key="data.page" class="list" :id="'page-' + data.page"> 何かの表示 </div> <template>
-
JAVASCRIPT vue headでHTMLヘッダにlink relを動的に追加・削除・変更するdata() { return { pageTotal: 0, pageNumber: 1, }; }, computed: { getRel: function() { let rel = [] if(this.pageNumber !== 1){ const prev = { rel: 'prev', id: 'rel-prev'} prev.href = this.$route.path + '?page=' + (parseInt(this.pageNumber) - 1) rel.push(prev) } if(parseInt(this.pageNumber) < parseInt(this.pageTotal)){ const next = { rel: 'next', id: 'rel-next'} next.href = this.$route.path + '?page=' + (parseInt(this.pageNumber) + 1) rel.push(next) } return rel }, }, head: { link: function () { return this.getRel }, },
-
JAVASCRIPT Vue.jsのフォームでsubmitをさせないでページ遷移させる<form @submit.prevent="doSearch"> <label for="search-txt">検索</label> <input type="text" name="key" placeholder="検索する" id="search-txt"> </form>
-
JAVASCRIPT フォームのinputでVuexのstoreデータをv-modelで使ってリアルタイムで変更する<input type="text" name="key" placeholder="キーワードで探す" v-model="keyword"> . . // 省略 . computed: { keyword: { get () { return this.$store.state.getKeyword }, set (value) { this.$store.commit('setKeyWord', value) } } },
-
JAVASCRIPT GoogleっぽいページャーのロジックgetPaginate: function() { let pages = [] // 最大ページ数から1引いた半分の数値をstartとendにセットする let start = parseInt(this.page) - (parseInt(this.pageMax - 1)/2); let end = parseInt(this.page) + (parseInt(this.pageMax - 1)/2); // startが1未満だった時はstartを1にしてendを最大ページ数にする if (start <= 0) { end = this.pageMax start = 1 } // endがpageTotal以上だった時はendをpageTotalにして // startを合計ページから最大ページ数-1個分戻った値にする if(this.pageTotal <= end){ end = this.pageTotal start = parseInt(this.pageTotal) - parseInt(this.pageMax - 1) } // ループしてpagesにページ番号を挿入する for(let i =start; i<=end; i++){ pages.push(i) } return pages },
-
JAVASCRIPT Vue Routerで、ネストした子ルートに親のdataを渡す<template> <div> <router-view v-bind:hoge="fuga"/> </div> </template> <script> export default { data() { return { fuga: {1: 'apple', 2: 'lemon'} } } } </script>
-
JAVASCRIPT [Vue.js] ネストしたRouteで、親ルート以下の場合activeクラスを付与する<template> <ul> <li v-for="page in pages"> <router-link :to="page.route" v-bind:exact="page.exact"> <span>{{page.title}}</span> </router-link> </li> </ul> </template> <script> export default { data() { return { pages: { page1: { route: {name: 'ParentChild1'}}, title: '子ページ', exact: false, }, page2: { route: {name: 'Parent'}}, title: '親ページ', exact: true, // trueじゃないと、子ページルート時にもactiveになる }, page3: { route: {name: 'ParentChild2'}}, title: '子ページ2', //このページ内でさらに子子ルートをネストしている exact: false, } } } } } </script> <style> .router-link-active{ } </style>
-
JAVASCRIPT Vue.js + Vuexで自サイトにHistoryがあるかを判定する. . . router.afterEach((to) =>{ if(store.getters.pageCount < 1){ store.commit('addPageCount') }else{ store.commit('setHasHistory', true) } })
-
JAVASCRIPT Vue.jsでPWAアプリとして表示されているかを判定する<template> <div> <button v-show="appBnr">インストールする</button> </div> </template> <script> export default { data() { return { appBnr: false }; }, mounted () { // アプリ if (window.matchMedia('(display-mode: standalone)').matches === false) { this.appBnr = true; } // safari if (window.navigator.standalone === false) { this.appBnr = true; } }, } </script>
-
JAVASCRIPT Vue.jsでPWAのインストールポップアップ(ホーム画面に追加ダイアログ)を強制的に表示させる<template> <div> <button v-on:click="installBnr">インストールする</button> </div> </template> <script> export default { methods: { installBnr(){ let deferredPrompt; window.addEventListener('beforeinstallprompt', (e) => { // Prevent Chrome 67 and earlier from automatically showing the prompt e.preventDefault(); // Stash the event so it can be triggered later. deferredPrompt = e; deferredPrompt.prompt(); }); } } } </script>
-
JAVASCRIPT Node.jsでコマンドラインの引数管理をするconst commandLineArgs = require('command-line-args'); const optionDefinitions = [ { name: 'verbose', alias: 'v', type: Boolean }, { name: 'title', alias: 't', type: String, }, { name: 'num', alias: 'n', type: Number, defaultValue: 3 } ]; const options = commandLineArgs(optionDefinitions);
-
JAVASCRIPT MongoDBでfindで絞り込みをして一括アップデート(Node.js)const collection = await db.collection('user') const tasks = await collection.updateMany( { "alive": true, "last_login": { $lte: dayjs().subtract(1, 'year').toISOString() } }, { $set: { "alive": false }, } )
-
JAVASCRIPT Javascriptでメソッド名やプロパティ名を動的に呼び出すconst name = 'hoge' let method_name = 'mtd_' + name let property_name = 'prop_' + name await SomeFunc[method_name](); // メソッド await SomeFunc[property_name]; // プロパティ
-
DOCKER Node.js + yarnのDockerイメージのDockerfileDockerfile FROM node:12.6-alpine WORKDIR /app RUN apk update && \ apk add git && \ apk add --no-cache curl && \ curl -o- -L https://yarnpkg.com/install.sh | sh ENV PATH $HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH CMD ["sh"]
-
RUBY UbuntuのHomebrewで「No developer tools installed.」の対策sudo apt-get install build-essential curl file git
-
JAVASCRIPT node.js ExpressでXMLフォーマットを出力する// // 何かのコード // res.type('application/xml'); return res.send(sitemap)
-
JAVASCRIPT Expressでキャッシュコントロールする「express-cache-controller」の使い方const cacheControl = require('express-cache-controller'); app.use(cacheControl({ maxAge: 0 })); app.get('/prefecture/:id/detail.json' function(req, res, next) { // 何かの処理 res.cacheControl = { maxAge: 15552000 }; return res.send(何かのデータ) });
-
RUBY RubyのMySQL2 gemで結果の有無を確認する方法#実行 db = Mysql2::Client.new('DB設定') sql = "SELECT * FROM posts WHERE status = 1" stmt = db.prepare(sql) res = stmt.execute() #結果チェック p res.count //-> 件数がでる。 p res.size //-> 件数がでる。 if res.count > 0 #何かの処理 end if res.size> 0 #何かの処理 end
-
JAVASCRIPT vueテンプレートの空ファイル<template> <div> </div> </template> <script> export default { } </script> <style scoped> </style>
-
JAVASCRIPT Vue JSでtitleやmetaタグを動的に変更する<script> export default { name: 'home', mounted: function(){ const title = "タイトル" const description = "説明文" document.title = title document.querySelector("meta[property='og:title']").setAttribute('content', title) document.querySelector("meta[name='description']").setAttribute('content', description) document.querySelector("meta[property='og:description']").setAttribute('content', description) } } </script>
-
GO HUGOのテンプレートで外部APIのJSONデータをロードして展開する{{ $json_url := 'APIのURL' }} {{ $data := getJSON $json_url }} {{ if gt (len $data) 0 }}{{ if not (eq (index $data 0) "") }} <section> <ul> {{range $data }} <li> <a href="{{ .referer }}" target="_blank"> <span>{{ .title}}</span> <span>{{ .url}}</span> </a> </li> {{ end }} </ul> </section> {{ end }}{{ end }}
-
GO HUGOで、表示させている記事以外の同一セクションの記事一覧を抽出する{{ $v1 := (where .Site.RegularPages "Section" "topics" )}} {{ $v2 := (where .Site.RegularPages ".Params.slug" "!=" .Params.slug)}} {{ $related:= $v1 | intersect $v2 }} {{ with $related }} <ul class="article-list"> {{ range . }} {{ partial "li" .}} {{ end }} </ul> {{ end }}
-
SASS HUGOでSASSを使うためのコード{{ $style := resources.Get "sass/main.scss" | toCSS | minify | fingerprint }} <link rel="stylesheet" href="{{ $style.Permalink }}">
-
CSS3 box-sizingを全ブラウザでborder-boxにする*, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -o-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
-
DOCKER Alpine LinuxベースのCloud9 + PHP 7コンテナFROM anatolinicolae/alpine-cloud9 MAINTAINER c0d3man <hoge@fuga.com> RUN sed -i -e 's/v3\.4/v3.6/g' /etc/apk/repositories RUN apk --no-cache add php7 php7-fpm php7-mysqli php7-json php7-openssl php7-curl \ php7-zlib php7-xml php7-phar php7-intl php7-dom php7-xmlreader php7-ctype \ php7-mbstring nginx supervisor curl
-
DOCKER ジェネレイト&FTPができるHUGOコンテナのDockerfileFROM alpine:latest RUN wget https://github.com/gohugoio/hugo/releases/download/v0.41/hugo_0.41_Linux-64bit.tar.gz RUN tar -xzf hugo_0.41_Linux-64bit.tar.gz RUN mv hugo /usr/local/bin/hugo RUN mkdir -p /hugo ## Install lftp & PHP RUN apk update && apk add lftp
Koji Kadomaさんのノート
-
nodenvでコマンド実行時にだけバージョンを指定する方法 -
Nuxtをアップグレードする方法 -
Nuxt3のSSGでpayloadの出力を止める方法 -
Nuxt3のサイトにGoogle Adsenseの自動広告を入れる方法 -
Cloudflare WranglerのV1とV2の両方を使い分ける方法 -
セルフホストCMS・DiretusをDocker&独自ドメインでサクッと構築する方法 -
Nuxt3でいくつかサイトを作ってみた雑感 -
メインのCMSをDirectusに移行した話 -
Gitlab PagesのHUGOイメージでUNTRUSTED signatureエラーの対処方法 -
Cloudflare Pages Functionsを使ってみた -
Nuxt3 + Cloudflare Workersを使ってみた感想 -
Gridsomeで外部スクリプトやCSSを追加する方法 -
Dexie.jsでクエリビルドを使いこなす -
Vue3でGoogle APIを使う -
Vue3でsleepを実装する -
Vue3でマークダウンを変換する -
Vue3でsetupを使って動的に一覧を絞り込む検索フォームを作る -
Vue3のsetup関数でVue Routerを使ってページネーションを制御する -
Vue3でDexiejsを使う -
GridsomeのblongsToでクエリ操作をする方法 -
Javascriptの静的サイトジェネレータまとめ -
Tailwind CSS互換の「Windi CSS」をGridsomeで使ってみた -
Nextcloudで管理ユーザーのパスワードを忘れた時のリセット方法 -
2021年版・定番PHPフレームワークまとめ -
Vue + Dexie + IndexedDBで作る簡単ノートアプリ -
Cockpit CMSをDockerコンテナで永続運用する -
Cockpit CMSでは静的コンテンツを管理しない方が良い理由 -
Cockpit CMSをCloudflare Pagesと連携させる -
GirdsomeでヘッドレスCMS・APIのマークダウン記法のデータを変換する -
PHP製ヘッドレスCMS・Cockpitレビュー -
WordPressでCloudflare Pagesのデプロイフックを使う方法 -
画像ファイルのstaticとassetsの使い分け -
Rancher OSでswapを設定して永続化する方法 -
Gridsomeでマークダウンの中でコンポーネントを使う方法 -
Gridsomeで検索ページを作る方法 -
Gridsomeでページャーを設置する方法 -
Gridsomeでのデータの構築され方と抽出方法 -
Gridsomeで1万ページ以上の中規模サイトを構築した感想 -
Gridsomeのstatic-queryとpage-queryの違い -
GridsomeでCSSフレームワーク・Tailwindcssを使う(PurgeCSSも) -
Gridsomeのビルドで「JavaScript heap out of memory」の対処方法 -
Vue.jsのUIライブラリ・フレームワークまとめ -
Gridsomeで「window」の値を使うときに注意したいこと -
Gridsomeで「require() of ES modules is not supported」の対処方法 -
GridsomeでTable Of Contents(目次)を自動挿入する方法 -
GridsomeでVue.jsプラグインを使う方法 -
GridsomeでGoogle Analytics 4を使う方法 -
静的サイトジェネレータ・GridsomeとHUGOの比較 -
しばらく使って感じたGridsomeの弱点 -
Vue.jsベースの静的サイトジェネレータGridsomeの感想 -
MongoDBのフルレストア方法まとめ -
amp-live-listの使い所と実装方法 -
AMPでwebp画像をSafariなどの非対応ブラウザに対応をする -
Netlify + Cloudflareでcf-cache-statusがREVALIDATEDになる時の対処方法 -
多言語化してhugo serverするとメイン言語以外の静的ファイルがNet Foundになる問題の解決策 -
静的サイトのロード速度をCloudflareのキャッシュで高速化してみた -
Cloudflare Workerで価格コムライクなリダイレクト(扉)ページを完全無料で作る -
HUGOで独自permalinkを設定したsectionのindexURLの設定方法 -
Docker + Mailuでマルチドメインメールサーバーを立ち上げる -
書評「JavaScript コードレシピ集」 -
書評「本当によくわかるJavaScriptの教科書」 -
Web Workerについてザックリ調べたことまとめ -
【保存版】 HUGOで使うフロントマッターまとめ -
フルAMPサイトを10サイト運営したのでメリット・デメリットをまとめてみる -
AMP Scriptでamp-script-srcのハッシュに対応する -
関数型コンポーネントで呼び出せる、よく使うAPIまとめ -
PWAアプリをOSのシェアダイアログの一覧に登録させてデータをシェアする方法 -
AMPページでWeb Share APIを呼び出す方法 -
CloudFlare WorkersでAPI情報を秘匿するProxyを建てる -
Vue.jsでCSSファイルをindex.htmlにインラインCSSとして取り込む方法 -
Vue.jsアプリの初期ロードを高速化するためにやったこと -
Vue.js PWAで、勝手にheadに挿入されるiconのリンク先を変更する方法 -
Vue.jsのMixinはコーポネントをまたいだ共通変数(設定)に使うと便利 -
Vue.jsアプリでAPIのCORSの壁を越える方法 -
AMPページでページシェア用に任意のURLをコピーするボタンを実装する -
HUGOで数万ページをビルドするならwhereを使わない方がいい -
SCSSの変換で@charsetが入ってしまう場合の対処方法 -
Node.jsでGoogle Cloud Storageをセキュアに操作する -
Dexie.jsでよく使うコマンドまとめ -
Vue.jsでIndexedDBとプラグイン「Dexie」で楽々クライアントデータベースを作成する -
Vue.jsで使えるブラウザストレージを調べた -
開発環境はHomebrew?docker?仮想マシン?使ってみて感じたそれぞれのメリット・デメリット -
GraphQL周りの開発環境を整える -
多言語SPAサイトでPWA(Service Worker)を使う時はファイルパスに注意 -
GraphQLのAPIをNode.js + Express + MySQLで試してみた -
HUGOでPartialやShortcodeの処理をアウトプットフォーマットごとに変える -
HUGOでpartialの中で$.Siteのデータを使う方法 -
SSRは必要?Javascriptで構築したSPAサイトのSEOを考える -
hugoでdataをページパラメータと組み合わせて使う -
PWAアプリをホーム画面に追加した時のリクエストヘッダのオリジンを検証 -
Herokuでワンクリックでcamoの画像HTTPSプロキシを立ててnode.jsアプリから呼び出す -
Vue.jsのSPAでPreFetchを使ってコンテンツを先読みして高速化する -
Vue.js + VuexでステートをブラウザのLocalStorageに保存・復元して永続管理する -
Vue.js + Vuexでkeep-aliveなコンポーネントに戻った時にstateを更新する方法 -
Vue.jsのSPAで、メンテナンスページを出す -
Vue.jsで作ったSPAがiOS Safariでクラッシュ多発した原因がCSSのトランジションだった話 -
Vue.jsで関数型コンポーネントの中で@clickでmethodを実行する -
Vue.jsでトランジションの間にページがスクロールしちゃう問題 -
Vue.jsで、入れ子になったコンポーネントの読み込みの動きを確認してみた -
Vue.js + Firebase AuthでログインsignInWithRedirectでログインフローを作る -
バッチサーバー用のNode.js + yarn環境をDockerで構築する -
node.jsのExpressでCloudflareのキャッシュを効かせる -
Vue.jsでlazysizesを使って画像遅延ロードを実装する -
Vue Routerの導入と基本的な使い方 -
Vue.jsのテンプレート挙動まとめ -
Vue.jsで、「Component template should contain exactly one root element.」エラーが出た時の原因と対応 -
HUGOでサイトを作る際にやっておきたいSEO対策10選 -
HUGOのテンプレートファイルの動きを確認する -
HUGOの設定ファイルを使いこなす -
HUGOサイトのメニューを設定ファイルからカスタマイズできるようにする -
HUGOのディレクトリ構成とそれぞれの役割を確認する -
HUGOのオリジナルテーマを作成する時に知っておきたい最低限の知識 -
Cloudflare WorkersでCookieを使う方法