Nuxt.js踩坑總結(jié)分享
構(gòu)建問題
1. 如何在 head 里面引入js文件?
背景: 在<head>標(biāo)簽中,以inline的形式引入flexible.js文件。本項(xiàng)目主要為移動(dòng)端項(xiàng)目,引入flexible.js 實(shí)現(xiàn)移動(dòng)端適配問題。
Nuxt.js 通過 vue-meta 實(shí)現(xiàn)頭部標(biāo)簽管理,通過查看文檔發(fā)現(xiàn),可以按照如下方式配置:
// nuxt.config.js head: { script: [ { innerHTML: 'console.log("hello")', type: 'text/javascript', charset: 'utf-8'} ] }
結(jié)果,生成 html:
<script data-n-head="true" type="text/javascript" charset="utf-8">console.log("hello")</script>
我們發(fā)現(xiàn) vue-meta 把引號(hào)做了轉(zhuǎn)義處理,加入 __dangerouslyDisableSanitizers: ['script'] 后,就不會(huì)再對(duì)這些字符做轉(zhuǎn)義了,該字段使用需慎重!
接下來,要把 console.log("hello") 的內(nèi)容替換成 flexible.js,配置升級(jí)之后:
head: { script: [{ innerHTML: require('./assets/js/flexible'), type: 'text/javascript', charset: 'utf-8'}], __dangerouslyDisableSanitizers: ['script'] }
踩坑成功,下一個(gè)坑...
2. 如何使用預(yù)處理器
背景:在組件中的<template>, <script> 或 <style> 上使用各種預(yù)處理器,加上處理器后,控制臺(tái)報(bào)錯(cuò)。
<style lang="sass"> .red color: red </style>
這個(gè)問題解決方法非常簡(jiǎn)單,只需要安裝這些依賴就好。
npm install --save-dev node-sass sass-loader
但是解決過程并不是很順利的,在閱讀中文文檔時(shí),忽略版本號(hào),按照上面的提示進(jìn)行操作,發(fā)現(xiàn)不能成功,后來各種debug,最后發(fā)現(xiàn)了該解決方案。后知后覺的發(fā)現(xiàn)了中文文檔的版本號(hào)過低,如果需要查看文檔,一定要看最新版本的英文文檔!
3. 如何使用px2rem
背景:在css中,寫入px,通過px2rem loader,將px轉(zhuǎn)換成rem
在以前的項(xiàng)目中,是通過 px2rem loader實(shí)現(xiàn)的,但是在Nuxt.js項(xiàng)目下,添加 css loader 還是很費(fèi)力的,因?yàn)樯婕暗絭ue-loader。
想到了一個(gè)其他方案,可以使用 postcss 處理??梢栽?nuxt.config.js 文件中添加配置,也可以在postcss.conf.js文件中添加。
build: { postcss: [ require('postcss-px2rem')({ remUnit: 75 // 轉(zhuǎn)換基本單位 }) ] },
4. 如何拓展 webpack 配置
背景:給 utils 目錄添加別名
剛剛說到,Nuxt.js內(nèi)置了 webpack 配置,如果想要拓展配置,可以在 nuxt.config.js 文件中添加。同時(shí)也可以在該文件中,將配置信息打印出來。
extend (config, ctx) { console.log('webpack config:', config) if (ctx.isClient) { // 添加 alias 配置 Object.assign(config.resolve.alias, { 'utils': path.resolve(__dirname, 'utils') }) } }
5. 如何添加 vue plugin
背景:自己封裝了一個(gè) toast vue plugin,由于 vue 實(shí)例化的過程沒有暴露出來,不知道在哪個(gè)時(shí)機(jī)注入進(jìn)去。
可以在 nuxt.config.js 中添加 plugins 配置,這樣插件就會(huì)在 Nuxt.js 應(yīng)用初始化之前被加載導(dǎo)入。
module.exports = { plugins: ['~plugins/toast'] }
~plugins/toast.js 文件:
import Vue from 'vue' import toast from '../utils/toast' import '../assets/css/toast.css' Vue.use(toast)
6.如何修改環(huán)境變量 NODE_ENV
背景:在項(xiàng)目中,設(shè)置 3個(gè) NODE_ENV 的值,來對(duì)應(yīng)不同的版本。development,本地開發(fā);release,預(yù)發(fā)布版本;production,線上版本。其中,預(yù)發(fā)布版本比production版本,多出vconsole。
// package.json "scripts": { "buildDev": "cross-env NODE_ENV=release nuxt build && backpack build", "startDev": "cross-env NODE_ENV=release PORT=3000 node build/main.js" },
打印 process.env.NODE_ENV 依舊是,production。
在 backpack 的源碼中,找到了答案,在 執(zhí)行 backpack build 命令時(shí),會(huì)把 process.env.NODE_ENV 修改為 production,并且是寫死的不可配置的......
無奈下,只能在 process.env 下,添加 __ENV 屬性,代表 NODE_ENV
這時(shí),在頁面中打印出來的信息 process.env.__ENV undefined,但是可以打印出 process.env.NODE_ENV。
可以通過配置 nuxt.config.js 中的,env屬性,解決該問題。
env: { __ENV: process.env.__ENV }
開發(fā)問題
1. Window 或 Document 對(duì)象未定義?
背景: 在引入第三方插件,或者直接在代碼中寫 window 時(shí),控制臺(tái)會(huì)給出警告,window 未定義。
發(fā)生在這個(gè)問題的原因時(shí),node服務(wù)端并沒有window 或 document 對(duì)象。解決方法,通過 process.browser 來區(qū)分環(huán)境。
if (process.browser) { // 引入第三方插件 require('***') // 或者修改window對(duì)象下某一屬性 window.mbk = {} }
最后
本文主要在項(xiàng)目中遇到的各種問題,文中有任何表述不清或不當(dāng)?shù)牡胤?,歡迎大家批評(píng)指正。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何利用vue實(shí)現(xiàn)css過渡和動(dòng)畫
過渡Vue在插入、更新或者移除 DOM 時(shí),提供多種不同方式的應(yīng)用過渡效果這篇文章主要給大家介紹了關(guān)于如何利用vue實(shí)現(xiàn)css過渡和動(dòng)畫的相關(guān)資料,需要的朋友可以參考下2021-11-11Vue-Router實(shí)現(xiàn)頁面正在加載特效方法示例
這篇文章主要給大家介紹了利用Vue-Router實(shí)現(xiàn)頁面正在加載特效方法示例,文中給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來一起看看吧。2017-02-02vuedraggable實(shí)現(xiàn)簡(jiǎn)單拖拽功能
這篇文章主要為大家詳細(xì)介紹了vuedraggable實(shí)現(xiàn)拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04vue常用指令實(shí)現(xiàn)學(xué)生錄入系統(tǒng)的實(shí)戰(zhàn)
本文主要介紹了vue常用指令實(shí)現(xiàn)學(xué)生錄入系統(tǒng)的實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02詳解基于Vue cli開發(fā)修改外部組件Vant默認(rèn)樣式
這篇文章主要介紹了詳解基于Vue cli開發(fā)修改外部組件Vant默認(rèn)樣式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04vue實(shí)現(xiàn)點(diǎn)擊關(guān)注后及時(shí)更新列表功能
這篇文章主要介紹了vue實(shí)現(xiàn)點(diǎn)擊關(guān)注后及時(shí)更新列表功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06vue element ui使用選擇器實(shí)現(xiàn)地區(qū)選擇兩種方法
這篇文章主要給大家介紹了關(guān)于vue element ui使用選擇器實(shí)現(xiàn)地區(qū)選擇的兩種方法,Element UI是一套基于Vue.js開發(fā)的UI組件庫,其中包含了地區(qū)選擇器(Cascader)組件,需要的朋友可以參考下2023-09-09Vue3響應(yīng)式高階用法之markRaw()的使用
在Vue3中,markRaw()用于防止對(duì)象被轉(zhuǎn)換為響應(yīng)式,適用于管理大型庫對(duì)象或靜態(tài)數(shù)據(jù),有助于優(yōu)化性能和防止不必要的修改,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下2024-09-09