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. jdk8-Optional类

    概念: package com.atguigu.java8; import java.util.Optional; import org.junit.Test; /* * 一.Optional 容器类 ...

  2. 接口测试-webservice接口---soapui

    1.添加项目 2.填入wsdl地址 3.编辑参数,运行接口

  3. Domination(概率DP)

    Domination 题目链接:https://odzkskevi.qnssl.com/9713ae1d3ff2cc043442f25e9a86814c?v=1531624384 Edward is ...

  4. Linux文件系统命令 cat

    命令名:cat 功能:在当前窗口中查看制定位置的文件的内容. eg: renjg@renjg-HP-Compaq-Pro--MT:~/test$ cat /etc/apache2/ports.conf ...

  5. Oracle中把一张表查询结果插入到另一张表中

      1. 新增一个表,通过另一个表的结构和数据 create table XTHAME.tab1 as select * from DSKNOW.COMBDVERSION 2. 如果表存在: inse ...

  6. 部署php的正确姿势

    1. 更新源 apt-get update 2.安装apache apt-get install apache2 ubuntu下apache2虚拟主机配置 cd /etc/apache2/sites- ...

  7. Ubuntu 16.04安装vsftpd 并开启ftp服务

    1. 安装 sudo apt-get install vsftpd 2.可以使用下列命令来打开,关闭,重启ftp服务 sudo /etc/init.d/vsftpd start sudo /etc/i ...

  8. HDU 1808 Halloween treats(抽屉原理)

    题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=1808 Problem Description Every year there is the same ...

  9. zedboard开发板上移植opencv代码(立体匹配)

    前言 公司要做立体匹配相关的项目,已有matlab和c++版本,可是不能做到实时显示立体信息,想要硬件实现实时,无奈本渣也是个硬件的新手,先按照实验室lyq同学的思路在zedboard开发板的纯ARM ...

  10. 检查服务器主从状态的脚本-check_server_state.sh

    分别检查服务器在Master/Slave状态下,各项服务是否正常,否则报警: 原来使用keepalived每隔1分钟调用,由于执行结果对keepalived的weight参数有影响,所以移动到外部,使 ...