因为本包包是个很懒惰的人,而后咱们有些个项目设计的不是很好,因此致使写代码的时候有不少这样的代码:javascript
require('../../../../../../foo.js');
写的时候数那个小点点感受人都要死了?
这种时候若是写node能像用了webpack
(and so on)那样可以require
别名就行了。
好比这样:java
require('modules/foo.js');
因而我搜寻了几种方法。node
如下内容来自于github上一名叫作branneman的同志的总结,我为他的内容进行了随性的翻译webpack
原文可查看这里git
"偷"自focusaurus / express_code_structure # the-app-symlink-trickgithub
node_modules
文件夹下面建立一个symlink
ln -nsf node_modules app
mklink /D app node_modules
cd node_modules && ln -nsf [模块路径]
,耍的时候请把app换成你要复制的模块的路径) 而后你就能够web
var Article = require('app/article');
小贴士:因为git不能处理跨平台的symlinks,因此你不能再git repo里面用这样的文件。不过若是你是在克隆后、git-hook或者是由开发人员手动建立一个symlink,那就没啥问题shell
另外,你能够在npm里面里面增长一条postinstall钩子,这个方法由scharf提出。能够把命令加进package.json
里面express
"scripts": { "postinstall" : "node -e \"var s='../src',d='node_modules/src',fs=require('fs');fs.exists(d,function(e){e||fs.symlinkSync(s,d,'dir')});\"" }
(叉烧包注释:postinstall
会在npm run install
前先自动执行)npm
在你的app里面增长
global.__base = __dirname + '/';
这样你就能够这样用了
var Article = require(__base + 'app/models/article');
这里下面再作推荐
设置环境变量NODE_PATH
成一个指向你app想用的模块的路径(做者的状况下是.)。
(叉烧包注释:最好是使用绝对路径,这样比较稳妥)
而后就能够
var Article = require('app/models/article');
在启动app前线确保已经设置好了环境变量
export NODE_PATH=.
set NODE_PATH=.
使用export
和set
是仅对当前shell有效的,若是你须要让他全局、永久的改变,须要修改你的配置文件
这个方法不会影响你的环境,除非node运行。他须要你改变应用启用命令。
像这样启动你的app
NODE_PATH=. node app.js
cmd.exe /C "set NODE_PATH=.&& node app.js"
(在win下面若是你在path和&&之间加空格的话就启动不了)
(叉烧包注释:这里推荐一下cross-env插件,能够跨平台使用命令,这样的话就能够用这样使用命令啦~ cross-env NODE_PATH=. node app.js
)
其实和4.2差很少
其实就是写成一个脚原本运行,不过这样比较方便加各类参数
例:
./app
(Windows PowerShell可)app
看这里
代码具体是这样
#!/usr/bin/env node 'use strict'; var spawn = require('child_process').spawn; var args = [ '--harmony', 'app/bootstrap.js' ]; var opt = { cwd: __dirname, env: (function() { process.env.NODE_PATH = '.'; // Enables require() calls relative to the cwd :) //叉烧包注释: 若是须要多个路径能够这样(须要额外 require path 模块) //process.env.NODE_PATH = ['.', './lib'].join(path. delimiter) return process.env; }()), stdio: [process.stdin, process.stdout, process.stderr] }; var app = spawn(process.execPath, args, opt);
#!/bin/sh NODE_PATH=. node app.js
@echo off cmd.exe /C "set NODE_PATH=.&& node app.js"
谢谢@joelabair和4.2差很少,但不须要在app以外指定NODE_PATH。可是,因为这依赖于一个专用的Node.js核心方法。
你须要在require
以前运行这个方法。
process.env.NODE_PATH = __dirname; require('module').Module._initPaths();
感谢@a-ignatov-parc
简单来讲你能够在你的app最开始运行这样的代码。
global.rootRequire = function(name) { return require(__dirname + '/' + name); }
而后就能够这样
var Article = rootRequire('app/models/article');
基于个人原则一贯来就是越快越好,打字越少越好,因此我的认为
require
…so => pass这个上面也提到过4和5中也提到过。
在启用时这样操做NODE_PATH=. node app.js
。
不过得考虑到不一样操做系统下面path分割符的问题,因此我的推荐是采用5.1中的方法,写一份node脚本
我hack了_findPath()
方法,这个就是想设成啥别名就啥别名w,只不过只能兼容到node6
已经封装成插件node-require-alias
,在这里自荐一下。
使用方法:
const path = require("path") require('node-require-alias').setAlias({ "@": path.join(__dirname, "this/is/a/path") }) // or require('node-require-alias').setAlias("@", path.join(__dirname, "this/is/a/path"))
require模块时候↓
require('@/abc.js')
欢迎来PR(づ ̄3 ̄)づ╭❤~
require
方法,这个和我想的hack差很少,可是这样兼容性比较好。code看这里。这个做者也封装成了一个插件,你们能够去支持一下sexy-require。这边的别名是配置在package.json
下面的export
方法的,经过Object.defineProperty
,在get方法时给模块的添加必要的属性各位有用过别的欢迎在评论里面告诉我哟~(@^_^@)~
node-require-alias
, node6.0环境以上的考虑一下package.json
配置的sexy-require package.json
和经过方法均可以设置别名由于我我的比较嫌弃这种写法,这里就不作介绍了,只作推荐
我我的比较的做,喜欢本身写仍是比较喜欢HACK!不过我以为加环境变量也很快,也不用管兼容b( ̄▽ ̄)d。
另外对于HACK方法我还作了十分随性的原理解析,你们想看的能够戳这里