Nuxt.js踩坑总结分享


Posted in Javascript onJanuary 18, 2018

构建问题

1. 如何在 head 里面引入js文件?

背景: 在<head>标签中,以inline的形式引入flexible.js文件。本项目主要为移动端项目,引入flexible.js 实现移动端适配问题。
Nuxt.js 通过 vue-meta 实现头部标签管理,通过查看文档发现,可以按照如下方式配置:

// nuxt.config.js
head: {
 script: [
  { innerHTML: 'console.log("hello")', type: 'text/javascript', charset: 'utf-8'}
 ]
}

结果,生成 html:

<script data-n-head="true" type="text/javascript" charset="utf-8">console.log("hello")</script>

我们发现 vue-meta 把引号做了转义处理,加入 __dangerouslyDisableSanitizers: ['script'] 后,就不会再对这些字符做转义了,该字段使用需慎重!

接下来,要把 console.log("hello") 的内容替换成 flexible.js,配置升级之后:

head: {
 script: [{ innerHTML: require('./assets/js/flexible'), type: 'text/javascript', charset: 'utf-8'}],
 __dangerouslyDisableSanitizers: ['script']
}

踩坑成功,下一个坑...

2. 如何使用预处理器

背景:在组件中的<template>, <script> 或 <style> 上使用各种预处理器,加上处理器后,控制台报错。

<style lang="sass">
.red
 color: red
</style>

这个问题解决方法非常简单,只需要安装这些依赖就好。

npm install --save-dev node-sass sass-loader

但是解决过程并不是很顺利的,在阅读中文文档时,忽略版本号,按照上面的提示进行操作,发现不能成功,后来各种debug,最后发现了该解决方案。后知后觉的发现了中文文档的版本号过低,如果需要查看文档,一定要看最新版本的英文文档!

3. 如何使用px2rem

背景:在css中,写入px,通过px2rem loader,将px转换成rem

在以前的项目中,是通过 px2rem loader实现的,但是在Nuxt.js项目下,添加 css loader 还是很费力的,因为涉及到vue-loader。

想到了一个其他方案,可以使用 postcss 处理。可以在 nuxt.config.js 文件中添加配置,也可以在postcss.conf.js文件中添加。

build: {
 postcss: [
  require('postcss-px2rem')({
   remUnit: 75 // 转换基本单位
  })
 ]
},

4. 如何拓展 webpack 配置

背景:给 utils 目录添加别名

刚刚说到,Nuxt.js内置了 webpack 配置,如果想要拓展配置,可以在 nuxt.config.js 文件中添加。同时也可以在该文件中,将配置信息打印出来。

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

背景:自己封装了一个 toast vue plugin,由于 vue 实例化的过程没有暴露出来,不知道在哪个时机注入进去。

可以在 nuxt.config.js 中添加 plugins 配置,这样插件就会在 Nuxt.js 应用初始化之前被加载导入。

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.如何修改环境变量 NODE_ENV

背景:在项目中,设置 3个 NODE_ENV 的值,来对应不同的版本。development,本地开发;release,预发布版本;production,线上版本。其中,预发布版本比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 的源码中,找到了答案,在 执行 backpack build 命令时,会把 process.env.NODE_ENV 修改为 production,并且是写死的不可配置的......

无奈下,只能在 process.env 下,添加 __ENV 属性,代表 NODE_ENV

Nuxt.js踩坑总结分享

这时,在页面中打印出来的信息 process.env.__ENV undefined,但是可以打印出 process.env.NODE_ENV。

可以通过配置 nuxt.config.js 中的,env属性,解决该问题。

env: {
 __ENV: process.env.__ENV
}

开发问题

1. Window 或 Document 对象未定义?

背景: 在引入第三方插件,或者直接在代码中写 window 时,控制台会给出警告,window 未定义。
发生在这个问题的原因时,node服务端并没有window 或 document 对象。解决方法,通过 process.browser 来区分环境。

if (process.browser) {
 // 引入第三方插件
 require('***')
 // 或者修改window对象下某一属性
 window.mbk = {}
}

最后

本文主要在项目中遇到的各种问题,文中有任何表述不清或不当的地方,欢迎大家批评指正。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
通过正则表达式实现表单验证是否为中文
Feb 18 Javascript
javascript设计模式之module(模块)模式
Aug 19 Javascript
jQuery弹出窗口打开链接的实现代码
Dec 24 Javascript
详谈for循环里面的break和continue语句
Jul 20 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
Sep 14 Javascript
javascript与PHP动态往类中添加方法对比
Mar 21 Javascript
d3.js实现自定义多y轴折线图的示例代码
May 30 Javascript
为什么要使用Vuex的介绍
Jan 19 Javascript
Windows下安装 node 的版本控制工具 nvm
Feb 06 Javascript
JavaScript Array.flat()函数用法解析
Sep 02 Javascript
在elementui中Notification组件添加点击事件实例
Nov 11 Javascript
vue实现锚点定位功能
Jun 29 Vue.js
Nuxt.js实战详解
Jan 18 #Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
Jan 18 #Javascript
ajax请求data遇到的问题分析
Jan 18 #Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
Jan 18 #Javascript
vue-scroller记录滚动位置的示例代码
Jan 17 #Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
Jan 17 #Javascript
详解微信小程序审核不通过的解决方法
Jan 17 #Javascript
You might like
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
python3个性签名设计实现代码
2018/06/19 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
斯福泰克软件测试面试题
2015/02/16 面试题
小学生家长评语大全
2014/02/10 职场文书
党员教师工作决心书
2014/03/13 职场文书
求职意向书
2014/04/01 职场文书
机关保密承诺书
2014/06/03 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书
Python面向对象编程之类的概念
2021/11/01 Python
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js