# Nuxt3 套件使用紀錄 ## aos 官方 modules 裡面有個套件是 Nuxt 版本的 aos:https://nuxt.com/modules/aos ,但目前有個 bug 作者太忙一直沒有修復,無法使用。所以我是直接安裝原本的 aos 套件 ```shell npm i aos --save ``` 然後初始化: ```htmlembedded <!-- /layouts/default.vue --> <script setup> import AOS from 'aos'; import 'aos/dist/aos.css'; onMounted(() => { AOS.init(); }); </script> ``` 最後就直接在 template 中正常使用了: ```htmlembedded <h2 data-aos="fade-up"> 標題標題標題標題標題標題 </h2> ``` > 後來有人又建立了一個叫做 nuxt3-aos 的套件: https://github.com/17630966776/nuxt3-aos ,可以參考看看。 ## nuxt-viewport 用來在 Nuxt 中判斷 media query 。 安裝: ```shell npm install --save-dev nuxt-viewport ``` 設置 `nuxt.config.ts` : ```typescript export default defineNuxtConfig({ modules: [ 'nuxt-viewport', ], // 設定自己的斷點(這邊是設定成 BS 的斷點),也可以不設定,直接用預設的斷點 viewport: { breakpoints: { xs: 375, sm: 576, md: 768, lg: 992, xl: 1200, xxl: 1400, }, cookieName: 'viewport', defaultBreakpoints: { desktop: 'xxl', tablet: 'md', mobile: 'sm', }, fallbackBreakpoint: 'xxl', }, }) ``` 在 .vue 中使用: ```javascript const { $viewport } = useNuxtApp() $viewport.isLessThan('lg') // 這邊會回傳是否小於 lg 斷點 ``` ## Bootstrap 5 用來在 Nuxt 中客製化自己的 Bootstrap 。 安裝: ```shell npm install --save-dev sass npm install bootstrap ``` 建立 `/plugins/useBootstrap.client.js` : ```javascript import * as bootstrap from 'bootstrap' export default defineNuxtPlugin(() => { return { provide: { bootstrap: bootstrap, } } }) ``` 建立 `/assets/scss/main.scss` : ```sass= // 首先要引入 bootstrap 5 的 functions @import "bootstrap/scss/functions"; // 複寫官方的 variable @import "variables.scss"; // 引入 bootstrap 5 需要的功能與元件 @import "bootstrap/scss/variables"; @import "bootstrap/scss/variables-dark"; @import "bootstrap/scss/maps"; @import "bootstrap/scss/mixins"; @import "bootstrap/scss/utilities"; @import "bootstrap/scss/root"; @import "bootstrap/scss/reboot"; @import "bootstrap/scss/type"; @import "bootstrap/scss/images"; @import "bootstrap/scss/containers"; @import "bootstrap/scss/grid"; @import "bootstrap/scss/buttons"; @import "bootstrap/scss/close"; @import "bootstrap/scss/modal"; @import "bootstrap/scss/helpers"; @import "bootstrap/scss/utilities/api"; // 最下面 import 自己的客製化 scss 檔案 ``` 設定 nuxt.config.ts : ```typescript export default defineNuxtConfig({ css: ['@/assets/scss/main.scss'], }) ``` 通過 js 使用 modal 、 toast 等元件: ```javascript const { $bootstrap } = useNuxtApp(); // 宣告變數 let toast; let model; onMounted(() => { // 通過 js 啟用 toast toast = new $bootstrap.Toast(document.getElementById('toast')) // 通過 js 啟用 model model = new $bootstrap.Modal(document.getElementById('news-modal')) }) // 建立 js 函數,執行 toast.show() 顯示吐司(也可以只用純 HTML 顯示吐司) const showToast = () => toast.show() // 然後調用 dispose,以確保在組件被銷毀前進行必要的資源釋放 onUnmounted(() => model.dispose()) ``` 另外 Nuxt3 的官方文件中有提到 Nuxt 內建了 postcss,預設配置了 `autoprefixer` ,但實際開發卻沒看到 Prefix 出現,這邊需要做以下額外處理: 首先在 `package.json` 中添加: ```json "browserslist": [ ">0.3%", "not ie 11", "not dead", "not op_mini all", "last 3 version", "Chrome >= 35", "Firefox >= 38", "Edge >= 10", "Explorer >= 10", "ie >= 10", "iOS >= 8", "Safari >= 8", "Android 2.3", "Android >= 4", "Opera >= 12" ] ``` 接著在 `nuxt.config.ts` 添加: ```typescript postcss: { plugins: { autoprefixer: {}, }, }, ``` 最後執行` npm run dev` 或 build 出來後的 CSS 就會成功產出 Prefix 了。 ## @nuxtjs/robots 用來在 Nuxt 中建立 `robots.txt` 檔案阻止爬蟲搜尋。 安裝: ```shell npm install @nuxtjs/robots ``` 設定及使用: ```typescript export default defineNuxtConfig({ modules: [ 'nuxt-viewport', [ '@nuxtjs/robots', { rules: { UserAgent: '*', Disallow: '/admin/' }, } ] ], }) ``` ## vue-countup-v3 用來讓畫面上的數字從 0 跑到目標數字。 安裝: ```shell npm install vue-countup-v3 ``` 設定 nuxt.config.ts : ```typescript export default defineNuxtConfig({ build: { transpile: ['vue-countup-v3'], }, }) ``` 使用: ```htmlembedded <template> <CountUp class="d-inline" :end-val="3000" :options="{ duration: 0.75, enableScrollSpy: true, useGrouping: false }" /> </template> <script setup> import CountUp from 'vue-countup-v3' </script> ``` ## Tres.js 可理解為 Vue 版本的 Three.js ,但剛開發沒多久,先拿來做做小專案玩就好~ 詳細使用方式請參考:https://hackmd.io/ghEdo63YQmCFJQg_Btw4-Q