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 相关文章推荐
xml转json的js代码
Aug 28 Javascript
javascript字母大小写转换的4个函数详解
May 09 Javascript
js获取页面description的方法
May 21 Javascript
基于JavaScript代码实现pc与手机之间的跳转
Dec 23 Javascript
深入浅析JavaScript中的Function类型
Jul 09 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
Aug 24 Javascript
微信小程序 自己制作小组件实例详解
Dec 22 Javascript
js实现上传并压缩图片效果
Jan 10 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
May 08 Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
Oct 01 Javascript
JS判断用户用的哪个浏览器实例详解
Oct 09 Javascript
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
Drupal7中常用的数据库操作实例
2014/03/02 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
PHP可变函数学习小结
2015/11/29 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
js 居中漂浮广告
2010/03/21 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
移动端界面的适配
2017/01/11 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
angular动态表单制作
2018/02/23 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
简单的Python的curses库使用教程
2015/04/11 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
Python原始套接字编程实例解析
2020/01/29 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
HTML5样式控制示例代码
2013/11/27 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
建筑班组长岗位职责
2014/01/02 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
教师见习报告范文
2014/11/03 职场文书
网络营销计划
2015/01/17 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
中学语文教学反思
2016/02/16 职场文书
检讨书格式
2019/04/25 职场文书
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL