从零搭建前端开发环境(零)——扩展篇:4.eslint统一代码规范

  1. 从零搭建前端开发环境(零)——基础篇:1.npm、git及项目初始化
  2. 从零搭建前端开发环境(零)——基础篇:2.webpack生产与开发环境配置
  3. 从零搭建前端开发环境(零)——扩展篇:3.jest单测
  4. 从零搭建前端开发环境(零)——扩展篇:4.eslint统一代码规范
  5. 从零搭建前端开发环境(零)——终极篇:5.构建自己的前端脚手架

注:扩展篇里的内容,并不是建立项目的必要条件,属于可选范围。但是如果项目复杂到了一定程度,终究还是要面对的。

统一代码规范的重要性,相信稍微有点项目经验的同学一定会有所感触,光靠人为的约定限制,效果是无法保证的。所以eslint这种强制性的代码规范还是很有必要引入的,不过代码规范到底选择什么版本,估计选择困难症的同学会纠结了。那么就由我不负责任的来提供一套方案,据说airbnb号称史上最严格标准,那么我们就用它。

1、查看airbnb依赖并安装

我们现在只需要安装最基础的eslint-config-airbnb-base就可以了,react、vue什么的后文再说。

 

$ npm info "eslint-config-airbnb-base@latest" peerDependencies

 

我们会看到如下信息(版本信息要注意,不一定会跟这里一模一样)

{ eslint: '^4.9.0', 'eslint-plugin-import': '^2.7.0' }

 

接下来就是按照它的提示安装了,注意,你的版本很可能跟我的不一样,要写自己的,再加上一个eslint-import-resolver-webpack来兼容webpack。

$ npm i -D eslint-config-airbnb-base eslint@4.9.0 eslint-plugin-import@2.7.0 eslint-import-resolver-webpack

2、配置.eslintrc.js

新建.eslintrc.js

const path = require('path');
const root = __dirname;

module.exports = {
  root: true,
  extends: 'airbnb-base',
  env: {
    browser: true,
    node: true,
    es6: true,
    jest: true
  },
  settings: {
    'import/resolver': {
      webpack: {
        config: path.resolve(root, 'config/webpack.base.js')
      }
    }
  }
}

还有.eslintignore(不过笔者发现用vscode如果在工作区不是直接引得demo目录,比如引得demo的父目录之类的,这个.eslintigonre不会生效,不过不影响eslint的自检查)

/config/
/dist/
/*.js
/test/**/coverage/
/test/**/reports/

之后,如果你用的vscode,就搜索eslint这个扩展(可以实时提示语法问题,虽不是必须,但是强烈推荐,如果电脑配置较低,有可能会很卡,往后看,还是有办法的),安装一下。然后,你就会看什么叫史上最严格标准……

运行下面的命令

$ ./node_modules/eslint/bin/eslint.js src/**/*.js

就可以看到它报告的结果,不要被吓到哦。写了这么久的代码,才发现我的代码竟然这么不规范。。。在上面的命令后面加上 --fix 可以修复部分警告。为了方便,我们在package.json的scripts里面加上一条命令(为了方便以后,我们把jsx也加进来了,反正影响不大,实在不需要删掉就好),来自动修复一些简单的格式。

"lint": "node ./node_modules/eslint/bin/eslint.js src/**/*.js src/**/*.jsx --fix",

只要运行这条命令,就可以修复一些缩进之类的小问题了,大问题还是得自己修复的。

还有更狠的,如果我们装上了eslint-loader,那么你要是代码不符合规范,那每次开发时保存,都会一片片的飘红,甚至过不了。

$ npm i -D eslint-loader

webapck.base.js配置相应改一下

      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: ['babel-loader','eslint-loader'],
      },

可以了,去修改你不规范的代码吧,编译不通过别怪我没提醒过啊~

3、配置展示

全部变化可看笔者的github记录,还是很清晰的。

package.json

{
  "name": "code-history",
  "version": "1.0.0",
  "description": "Use to show the change of code in blog!",
  "main": "index.js",
  "scripts": {
    "test": "jest --config config/jest.config.js",
    "prod": "webpack --config config/webpack.prod.js",
    "dev": "webpack-dev-server --config config/webpack.dev.js --open",
    "lint": "node ./node_modules/eslint/bin/eslint.js src/**/*.js src/**/*.jsx --fix",
    "start": "npm run dev"
  },
  "keywords": [],
  "author": "zhaolandelong@163.com",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-eslint": "^8.2.2",
    "babel-loader": "^7.1.4",
    "babel-preset-env": "^1.6.1",
    "babel-preset-stage-2": "^6.24.1",
    "css-loader": "^0.28.11",
    "eslint": "^4.9.0",
    "eslint-config-airbnb-base": "^12.1.0",
    "eslint-import-resolver-webpack": "^0.9.0",
    "eslint-loader": "^2.0.0",
    "eslint-plugin-import": "^2.7.0",
    "extract-text-webpack-plugin": "^3.0.2",
    "file-loader": "^1.1.11",
    "html-webpack-plugin": "^3.1.0",
    "jest": "^22.4.3",
    "jest-babel": "^1.0.1",
    "less": "^3.0.1",
    "less-loader": "^4.1.0",
    "postcss-import": "^11.1.0",
    "postcss-loader": "^2.1.3",
    "postcss-url": "^7.3.1",
    "style-loader": "^0.20.3",
    "url-loader": "^1.0.1",
    "webpack": "^3.11.0",
    "webpack-dev-server": "^2.11.2",
    "webpack-merge": "^4.1.2"
  }
}

 

目录结构

 

demo    
  |- config/  
    |- jest.config.js  
    |- webpack.base.js    
    |- webpack.dev.js    
    |- webpack.prod.js    
  |- src/    
    |- assets/    
     |- logo.jpg  
    |- util/  
      |- index.js  
    |- index.css    
    |- index.js    
  |- test/  
    |- spec/  
      |- util.spec.js  
  |- .babelrc    
  |- .eslintignore
  |- .eslintrc.js
  |- .gitignore    
  |- .postcssrc.js    
  |- index.html    
  |- package.json  

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在前两文章中,我们已经搭建了一个基本的前端监控系统,但是我们发现,在监控页面嵌入的 iframe 中,用户无法进行前进后退操作,这对于用户体验来说是非常不友好的。因此,在本文中,我们将会实现控制 iframe 前进后退的功能。 ## 实现思路 实现控制 iframe 前进后退的功能,我们需要做以下几个步骤: 1. 在监控页面中添加前进和后退按钮 2. 监听前进和后退按钮的点击事件 3. 在 iframe 中执行前进和后退操作 4. 在监控页面中更新前进后退按钮的状态 ## 添加前进后退按钮 在监控页面的 HTML 中,我们添加两个按钮,一个用于前进操作,一个用于后退操作: ```html <button id="btn-back" disabled>后退</button> <button id="btn-forward" disabled>前进</button> ``` 这里我们给按钮设置了 `id` 属性,用于后面的 DOM 操作,同时设置了 `disabled` 属性,表示按钮默认是不可用状态。 ## 监听按钮点击事件 接下来,我们要监听按钮的点击事件,并在点击时执行相应的前进或后退操作。我们可以通过 `addEventListener` 方法来实现: ```javascript document.getElementById('btn-back').addEventListener('click', function() { window.frames['monitor-iframe'].history.back(); }); document.getElementById('btn-forward').addEventListener('click', function() { window.frames['monitor-iframe'].history.forward(); }); ``` 这里我们分别给两个按钮添加了点击事件的监听器,并在点击时分别调用了 `history.back()` 和 `history.forward()` 方法,这两个方法可以实现 iframe 的前进和后退操作。 注意,我们在调用 `history.back()` 和 `history.forward()` 方法时,使用了 `window.frames['monitor-iframe']` 来获取 iframe 对象。这里的 `monitor-iframe` 是我们在前面创建 iframe 时设置的 `name` 属性。 ## 更新按钮状态 最后,我们需要在监控页面中更新前进后退按钮的状态。我们可以通过 `history` 对象的 `length` 属性来判断当前是否可以进行前进或后退操作: ```javascript var btnBack = document.getElementById('btn-back'); var btnForward = document.getElementById('btn-forward'); window.frames['monitor-iframe'].addEventListener('load', function() { if (window.frames['monitor-iframe'].history.length > 0) { btnBack.removeAttribute('disabled'); } else { btnBack.setAttribute('disabled', true); } if (window.frames['monitor-iframe'].history.length < window.frames['monitor-iframe'].history.forward()) { btnForward.removeAttribute('disabled'); } else { btnForward.setAttribute('disabled', true); } }); ``` 这里我们通过 `addEventListener` 方法给 iframe 添加了 `load` 事件的监听器,在 iframe 加载完成后更新按钮状态。 对于前进按钮,如果当前历史记录中有可前进的记录,我们就把 `disabled` 属性移除,使按钮变为可用状态;否则,我们就把 `disabled` 属性设置为 `true`,禁用按钮。 对于后退按钮,我们需要判断当前是否可以进行后退操作。如果当前历史记录中有可前进的记录,我们就把 `disabled` 属性移除,使按钮变为可用状态;否则,我们就把 `disabled` 属性设置为 `true`,禁用按钮。 ## 总结 至此,我们已经成功实现了控制 iframe 前进后退的功能。通过本文的学习,我们不仅学会了如何在监控页面中添加前进后退按钮,还学会了如何通过 JavaScript 控制 iframe 的前进后退操作,以及如何更新按钮的状态。这些技能对于我们开发其他类似功能的应用也是非常有用的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值