nodejs require hook 功能很强大,我们可以用来将不支持的数据文件,直接使用require 进行加载,同时
我们可以方便的进行代码的预编译(比如babel 的组件)
为了方便使用npm 包,使用lerna 进行单体组件仓库的开发模式,demo 主要是加载markdown 文档

环境准备

  • 项目初始化
 
lerna init
mkdir -p packages/hook  packages/useage
 
  • 项目结构
├── README.md
├── lerna.json
├── package.json
└── packages
    ├── hook
    │ ├── compiler.js
    │ ├── hooks.js
    │ ├── index.js
    │ └── package.json
    └── useage
        ├── app.js
        ├── package.json
        └── users.md
 

代码说明

主要是hook,useage 是使用

  • hook
    hooks.js:
 
const addHook = function (ext, compile) {
    require.extensions[ext] = function hook(module, file) {
      const content = compile(file);
      return module._compile('module.exports = ' + JSON.stringify(content), file);
    }
  }
module.exports = addHook;
 
 

compiler.js:

const fs = require('fs');
const compiler = file => {
  const content = fs.readFileSync(file, { encoding: 'utf8' });
  return content;
}
module.exports = compiler;
 
 

index.js:

const hook = require('./hooks');
const compiler = require('./compiler');
module.exports = function ({ extensions }) {
  extensions = (extensions || []).map((ext) => ext.replace('.', ''));
  extensions.forEach((ext) => hook(`.${ext}`, compiler));
}
 
 
  • 使用
    添加package 引用
 
+ "dependencies": {
+ "hook":"1.0.0"
+ }
 
 

app.js:

require('hook')({
    extensions: ['txt', 'md'],
  });
const content = require("./users.md")
console.log(content)
 
 

运行&&测试

  • 初始化lerna 模块
lerna bootstrap
 
  • 运行
yarn s
 
  • 效果
yarn s
yarn run v1.10.1
warning package.json: No license field
$ lerna run --parallel s
lerna info version 2.11.0
lerna info run in 1 package(s): npm run s
useage: > useage@1.0.0 s /Users/dalong/mylearning/markdown-require-project/packages/useage
useage: > node app
useage: # userlists
useage: * dalong
useage: * demo
lerna success run Ran npm script 's' in packages:
lerna success - useage
✨ Done in 1.23s.
 

Require Extensions 原理

https://gist.github.com/jamestalmage/df922691475cff66c7e6 这篇文档不错,很清晰

参考资料

https://gist.github.com/jamestalmage/df922691475cff66c7e6
https://github.com/rongfengliang/require-hook-learning

nodejs-hook 开发的更多相关文章

  1. Visual Studio Code搭建NodeJs的开发环境

    一.Visual Studio Code搭建NodeJs的开发环境 1.下载安装NodeJs并配置环境变量 可以参考:NodeJs的安装和环境变量配置 2.下载安装 VS Code编辑器 可以参考:V ...

  2. Nodejs微信开发使用wechat-api回复多条消息

    在上一往篇文章<Nodejs微信开发>中,微信后台能够正常的接收到客户端的消息,并能够简单的回复一条消息至客户端. 但我的目录是将微信与Bot Framework进行关联,那么肯定就有一些 ...

  3. nodejs express开发

    用NodeJS+Express开发WEB应用---第一篇 大漠穷秋2014-03-28 预热 为了对后面的内容理解更加透彻,推荐首先阅读下面这篇很好的文章: http://www.nodebeginn ...

  4. ART模式下基于Xposed Hook开发脱壳工具

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78092365 Dalvik模式下的Android加固技术已经很成熟了,Dalvik ...

  5. 基于dalvik模式下的Xposed Hook开发的某加固脱壳工具

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77966109 这段时间好好的学习了一下Android加固相关的知识和流程也大致把A ...

  6. 使用Nodejs+mongodb开发地图瓦片服务器

    原先地图瓦片服务器采用的是arcgisserver发布的地图服务并进行切片,但ags发布的地图服务很占内存,发布太多的话服务器压力很大.再一个就是ags价太高了. 学习Nodejs之后,发现这是一个可 ...

  7. nodejs前端开发环境安装

    1.       nodejs安装 要求:node版本6.2.0及以上,npm版本3.8.9及以上 Nodejs安装包地址: 2.    在rTools上下载并安装git 3.    在rTools上 ...

  8. nodejs入门开发与常用模块

    npm:NodeJs包管理器 express:服务器端比较流行的MVC框架,处理服务请求,路由转发,逻辑处理 http://socket.io:实现服务端和客户端socket通信解决方案 ); // ...

  9. Nodejs全站开发学习系列 & 深入浅出Node学习笔记 & Spider抓取

    https://course.tianmaying.com/node 这个系列的文章看起来很不错,值得学习一下. /Users/baidu/Documents/Data/Interview/Web-S ...

  10. Nodejs WEB开发常用库和框架

    我在Nodejs的体系里也算泡了很久了,的确非常喜欢javascript和Nodejs. 在我看来,用nodejs做web开发有以下几个优点: Javascript作为一个语法异常简单的脚本语言,约束 ...

随机推荐

  1. Linux系统管理常用命令用法总结(1)

    1.usermod可用来修改用户帐号的各项设定. usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数& ...

  2. Spring学习三

    Spring注解来注入bean 在classpath中扫描组件 组件扫描,即componetscanning 利用注解来扫描的组件有  @Component  :基本注解,表示一个受Spring管理的 ...

  3. <Impala><Overview><UDF>

    Overview Apache Impala (incubating) is the open source, native analytic database for apache Hadoop. ...

  4. python Django rest-framework 创建序列化工程步骤

    11创建项目 2创建应用 3stting添加应用(apps)-添加制定数据库-修改显示汉字(zh-hans)-上海时区(Asia/Shanghai) 4主路由添加子路由 5应用里创建子路由 6创建数据 ...

  5. tp5 生成缩略图片

    我先说下我的思路,先把正常图片存到服务器,再通过代码将服务器上的大图压缩,生成新的小图替代大图 下面上代码 前台HTML代码 <div class="upload-btn"& ...

  6. js第一天学习内容

    var a=12: var t=(- -a)-(a- -)+(a++)-(a++) console.log(a) t=-1: a=12: (- -a)=11-(a=11- -)=10+(a=10++) ...

  7. POJ 2409 Let it Bead(polya裸题)

    题目传送:http://poj.org/problem?id=2409 Description "Let it Bead" company is located upstairs ...

  8. 【Python】管道通信和condition

    #练习:管道练习,双工,单工,将受到的消息保存到文件中 import multiprocessing as mp from multiprocessing import Process,Lock de ...

  9. matlab调用规则变量名eval函数

    eval 函数运用!! 经常会遇到matlab里面有些变量命名其实有一样的规律,,但是不像矩阵这些是可以通过循环来获取的,这个时候就可以利用eval语句了:   首先,假设现在有10个名称类似的变量, ...

  10. MYSQL escape用法--转义

    在sql like语句中,比如 select * from user where username like '%nihao%',select * from user where username l ...