编写浏览器和Node.js通用的JavaScript模块
长期以来JavaScript语言本身不提供模块化的支持, ES6中终于给出了 from, import等关键字来进行模块化的代码组织。 但CommonJS、AMD等规范已经被广为使用,如果希望你的JavaScript同时支持浏览器和Node.js, 现在只有这几种方式:
通过 browserify等工具进行转换。 提供浏览器端CommonJS框架,比如这个简易的 CommonJS 实现。 通过小心的编码来支持多种环境。
browserify几乎可以保证Node.js下测试通过的代码在浏览器中仍然能够正常使用。 但缺点也很显然:很容易产生冗余代码并生成一个巨大的JavaScript库。 对于微型的JavaScript工具,小心地编码再合适不过了!见下文。
避开全局的名称空间
CommonJS中,每个源文件中的局部变量在其他文件中不可见。 然而浏览器中,所有全局名称空间的变量对所有JavaScript文件都可见。 这意味着我们需要包装所有的代码。例如:
(function(){ // your code goes here...})();
不同于常见编程语言,JavaScript采取函数作用域, 用一个 function来包裹你的代码可以隐藏里面的局部变量。
如果你对整个文件都被缩进的代码很反感,可以在构建时再添加上述代码。例如Makefile中:
person.js: index.js echo '(function(){' > $@ cat $^ >> $@ echo '})();' >> $@
如果你对Make构建前端项目感兴趣,可以看看Harttle的尝试:Makefile构建前端项目
一个简单的类
当然,『类』指的就是一个函数。假设我们的JavaScript模块提供一个叫做 Person的类:
(function(){ function Person(){ this.name = 'harttle'; }})();
下文将会考虑如何将这个类提供给其他模块使用。
检测CommonJS环境
要使用 typeof来检测一个变量是否曾被声明,因为 if对于未声明的变量会抛出错误。 例如:
// Uncaught ReferenceError: foo is not definedif(foo == undefined){ console.log('foo does not exist');}// 正常运行if(typeof foo == 'undefined'){ console.log('foo does not exist');}
检测CommonJS我们只需要检测 module, exports, require是否存在,比如:
// CommonJSif (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { module.exports = Person;} 检测浏览器环境
浏览器环境也包括引入了AMD框架的,以及没有做模块化的。 对于前者我们应当使用AMD框架来声明一个模块,而对于后者我们只需要暴露一个全局变量。
// Browserif (typeof define === 'function' && define.amd) { define('Person', [], function() { return Person; });} else { window.Person = Person;}
当然这些浏览器检测相关逻辑也应当一并包裹在 function中。
编写浏览器和Node.js通用的JavaScript模块的更多相关文章
- 如何写兼容浏览器和Node.js环境的Javascript代码
如果有打开过jQuery的源码(从1.11及以后),或者Vue.js.React.js的源码,都会在文件的前面看见这样一段代码: ( function( global, factory ) { &qu ...
- 使用node.js 进行服务器端JavaScript编程
node.js 入门 node.js 可以运行在 Linux.Windows 和 Macintosh 等主流的操作系统上.在 Windows 平台上运行 node.js ...
- 编写原生的Node.js模块
导语:当Javascript的性能遭遇瓶颈,或者需要增强Javascript能力的时候,就需要依赖native模块来实现了. 应用场景 日常工作中,我们经常需要将原生的Node.js模块做为依赖并在项 ...
- node.js第二天之模块
一.模块的定义 1.在Node.js中,以模块为单位划分所有功能,并且提供了一个完整的模块加载机制,这时的我们可以将应用程序划分为各个不同的部分. 2.狭义的说,每一个JavaScript文件都是一个 ...
- node.js(七) 子进程 child_process模块
众所周知node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了child_process模块,通过多进程来实现 ...
- node.js中使用http模块创建服务器和客户端
node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...
- 创业笔记-Node.js入门之JavaScript与Node.js
JavaScript与Node.js JavaScript与你 抛开技术,我们先来聊聊你以及你和JavaScript的关系.本章的主要目的是想让你看看,对你而言是否有必要继续阅读后续章节的内容. 如果 ...
- Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
从浏览器中创建 XMLHttpRequests 从 node.js 创建 http 请求 支持 Promise API 拦截请求和响应 转换请求数据和响应数据 取消请求 自动转换 JSON 数据 客户 ...
- 基于promise用于浏览器和node.js的http客户端的axios
axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征: 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支 ...
随机推荐
- 【转】Ubuntu 14.04 引导修复(Boot Repair)(双系统修复一)
这几天不是我闲着没事做,实在是电脑故意跟我过不去,一不小心,Windows就再也无法打 开了,然后的然后,你们都知道就是重装系统喽.但是重装系统后,会发现原来的Ubuntu引导不见了,开机直接进入Wi ...
- IOS-2016年最好的15个Web设计和开发工具
设计师和开发者,web设计师和开发者遍地开花.这促使web开发人员也需要寻找最好的工具去设计出优于其他人的网站.作为一个web设计师或开发者,你必须寻找新的途径来提高自己的技能,提高自己的工作质量.下 ...
- Ansible 小手册系列 七(Ad-hoc)
Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook.前者可以解决一些简单的任务, 后者解决较复杂的任务. ad hoc——临时的,在ansible ...
- nodejs利用express操作mysql增删改查
如果不知道怎么连接数据库的请看http://www.cnblogs.com/complete94/p/6714757.html 我当大家都知道怎么连接数据库了,那么 我们开始吧 var express ...
- 重温MVC基础入门
重温MVC基础入门 简介 本文主要是作者回顾MVC基础的文章,整合个人认为基础且重点的信息,通过简单实践进行复习. 相关代码地址:https://github.com/OtherRuan/Revi ...
- PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
本文实例讲述了PHP获取日期对应星期.一周日期.星期开始与结束日期的方法.分享给大家供大家参考,具体如下: /* * 获取日期对应的星期 * 参数$date为输入的日期数据,格式如:2018-6-22 ...
- UITextField 限制用户输入小数点后位数的方法
UITextField 限制用户输入小数点后位数的方法 位数限制: limited 在UITextField的代理方法中添加类似如下代码 - (BOOL)textField:(UITextField ...
- SpringInAction-- 配置Profile Bean
Profile Bean 使用场景描述: 在开发软件的时候,在数据库方面,往往不是一个库就能解决的,一般分为开发库.测试库.生产库,在这些库设置链接的时候,也会配置其对应的数据. 现有一种方式,就是单 ...
- eclipse集群tomcat
eclipse集群tomcat 1. File -> new -> other 选择server. 2. 选择Apache下边对应的tomcat版本,配置tomcat名称即可.由于我本 ...
- linux下如何启动和关闭weblogic .
在你定义的域中可以找到如下命令: /[youHome]/domains/[yourDomain]/startWebLogic.sh /[youHome]/domains/[yourDomain]/st ...