前言

opn模块通常是作为跨平台的打开文件或者网站的模块,在web应用中最常见的使用是比如项目开发或者启动的时候打开浏览器进行访问。

优点

  • 长期维护
  • 支持应用参数
  • 因为它使用spawn而不是更安全exec
  • 修复了大部分未node-open解决的问题
  • 包含Linux 的最新xdg-open脚本

模块地址

https://npm.taobao.org/package/opn

基本使用

安装

$ npm install opn

使用

const opn = require('opn');// Opens the image in the default image viewer
opn('unicorn.png').then(() => {// image viewer closed
});// Opens the url in the default browser
opn('http://sindresorhus.com');// Specify the app to open in
opn('http://sindresorhus.com', {app: 'firefox'});// Specify app arguments
opn('http://sindresorhus.com', {app: ['google chrome', '--incognito']});
复制代码

api

目标

类型为字符串。 目标通常为你想打开的文件、url或者可执行的文件,一般会用系统中默认的应用打开,当然也可以指定应用以及相关的开启参数。

配置项

类型为对象,object。

  • wait 等待,布尔型 默认为false,不需要等待。

  • app 指定打开的应用,字符串类型 windows平台必须设置app,可以设置相关的app启动参数,特殊说明,chrome的指定字符串, win : chrome ,mac :google chrome,linux:google-chrome

实践

自己在本地写了一个demo,可以实现这个模块的使用,在使用的时候大家要注意我们除了常规的gulp调用模块之外也可以直接用npm工作流来实现我的需求,在根目录下新建scripts文件夹,写对应的功能js文件,然后在package.json中直接node 执行这个文件即可。

//package.json"scripts": {"test": "teset","opn": "gulp ","opn2":"node ./scripts/opn"},
复制代码
//gulpfile.js
let gulp = require("gulp")
let opn = require("opn")
let os = require("os")
let uri="http://www.baidu.com"
gulp.task("default",function(){let osStr=os.platform()if(osStr.indexOf("win")>-1){opn(uri, {app: ['chrome']});}})
复制代码
// opn.js
let opn = require("opn")
let os = require("os")
let osStr = os.platform()
let uri = "http://www.baidu.com"
if(osStr.indexOf("win")>-1){opn(uri, {app: ['chrome']});
}
复制代码

更多探索

我们知道默认的webpack也可以通过dev-server来实现启动浏览器和服务,我们看下它是否也是依赖这个模块实现的呢?

在webpack-dev-server 的模块中,生产依赖中,我们如愿找到了opn的模块依赖,顺便我扒一下它的github托管的源代码,源文件地址:webpack-dev-server,在这个文件中,我们找到了 opn模块的引入以及其对应的使用,在这里我先吧代码搬下来,然后和大家一起分析下与我们的使用有何不同。

代码

const open = require('opn');
if (options.open) {let openOptions = {};let openMessage = 'Unable to open browser';if (typeof options.open === 'string') {openOptions = { app: options.open };openMessage += `: ${options.open}`;}open(uri + (options.openPage || ''), openOptions).catch(() => {console.log(`${openMessage}. If you are running in a headless environment, please do not use the open flag.`);});}
复制代码

代码分析

  • 作为常识我们要知道引入的模块我们一般不会更改的,所以定义用的const,同理大家在定义常量的时候也要注意这点;而在模块内定义的变量尽量用let.
  • 作为常识,我们要知道对象的属性未配置或者配置为undefined 转为布尔均为false的,所以判断其是否配置只需要 options.open即可
  • 一个小功能需要的字段以及提示信息需要在功能开始之前进行定义,比如openOptions,openMessage
  • 针对引入的字段需要做严谨的判断,比如配置项的options.open 的类型,如果存在的话,那么就需要指定对应的app,并修改其报文信息。
  • 针对字符串的拼接尽量引用字符串的模板语法${}
  • 尽可能的简化语法,简单的字符串拼接不用单独定义一个变量,uri + (options.openPage || ''),同时针对配置项的异常情况提供一个默认空字符串
  • 针对模块的使用异常,进行catch捕捉,如果感觉模块本身的报错不够,可以追加自己业务的报错信息。

你需要了解的opn模块相关推荐

  1. npm模块之opn使用教程(node **.js直接再浏览器中打开相应的文件)

    安装 $ npm install opn --save 使用方法 const opn = require('opn');// opens the image in the default image ...

  2. vue-cli的各个配置文件的详细介绍

    1.dev-server.js // dev-server.js // 调用check-versions.js 模块,检查版本node和npm的版本 require('./check-versions ...

  3. node实现自启动浏览器打开某网址

    方法一.利用child_process.exec() child_process是node.js的内置模块 var c = require('child_process'); // 使用默认浏览器打开 ...

  4. npm模块之opn使用教程(译)

    原文链接 安装 $ npm install --save opn 使用方法 const opn = require('opn');// opens the image in the default i ...

  5. oracle电子商务套件视频,Oracle电子商务套件培训 Oracle EBS R12 制造模块培训视频教程 Oracle管理套件教程...

    Oracle电子商务套件培训 Oracle EBS R12 制造模块培训视频教程 Oracle管理套件教程│  ├<01> │  │  ├00_ERP基本原理-概念补充.pdf │  │  ...

  6. etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程

    1. etcd 项目结构和功能 etcd 项目代码的目录结构如下: $ tree ├── auth ├── build ├── client ├── clientv3 ├── contrib ├── ...

  7. OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能

    1. OpenCV 概念 图像处理( Image Processing )是用计算机对图像进行分析, 以达到所需结果的技术, 又称影像处理. 图像处理技术一般包括图像压缩, 增强和复原, 匹配.描述和 ...

  8. Python 多线程总结(1)- thread 模块

    thread 模块 1. 单线程 首先看下单线程程序运行的例子,如下所示, import timedef loop0():print 'start loop0 begin', time.ctime() ...

  9. 关于python导入模块和package的一些深度思考

    背景 在python中有导入模块和导入package一说,这篇文章主要介绍导入模块和package的一些思考. 首先什么是模块?什么是package? 模块:用来从逻辑上组织python代码(变量,函 ...

最新文章

  1. 【Linux】一步一步学Linux——chmod命令(110)
  2. 【转】杀人后一个孩子的做法…不看你会后悔的…
  3. 连接堡垒机出现java环境_Java 8:长期支持的堡垒
  4. tomcat java_opts 最大_tomcat性能优化(JAVA_OPTS)
  5. 优化Angularjs的$watch方法
  6. git clone --depth=1引起的问题
  7. Python – numpy.linspace()
  8. LINGO 11.0安装教程
  9. ab plc编程软件计算机语言,AB plc-Rslogix5000 software 软件编程实例.pdf
  10. 信息学奥赛一本通(C++版) 第三部分 数据结构 第四章 图论算法
  11. JK触发器波形图分析
  12. 【读心术】之微表情——《Lie to me 》摘自百度百科
  13. 移动端 click 300ms 延迟,如何解决
  14. Node-RED使用指南:5:设置管理员的登录密码
  15. Java 计算数字各位数值之和并转化为拼音输出
  16. 【cocos2d-x 大型ARPG手游研发2----精灵的八面玲珑】
  17. Python 中 selenium 设置参数,不打开可视化页面,后台执行爬虫程序
  18. 四川省教育考试院计算机准考证打印,四川省教育考试网官网准考证打印
  19. 强势测试思维和弱势测试思维
  20. 剪映Mac版正式上线,Windows版2021年2月上线,期待吗

热门文章

  1. [论文笔记] SODA小目标综述(西工大)
  2. 人间不值得计算机谱子,人间不值得简谱-黄诗扶演唱-桃李醉春风曲谱
  3. 战地4修改的服务器地址,战地4服务器区域设置
  4. elasticsearch之增删改查与其他基本操作
  5. 高并发抢红包系统红包随机金额生成算法
  6. 实训9——蓝牙修改开锁密码
  7. Go 每日一库之 gorilla/handlers
  8. 网易我的世界服务器加载无响应,我的世界网易版开始游戏没反应
  9. Redis说无法分配内存该怎么办?
  10. 如何传输利润中心主数据