当前位置: 首页 > 后端技术 > Node.js

使用Node.js为require设置别名(alias)

时间:2023-04-03 20:48:20 Node.js

使用Node.js为require设置别名(alias)编码时,有很多这样的代码:require('../../../../../../foo.js');写字的时候数着小点点感觉人要死了?这个时候,如果节点在写的时候可以像webpack(等等)那样需要别名就好了。例如:require('modules/foo.js');所以我搜索了几种方法。branneman总结的方法以下内容来自github上一个叫branneman的同志的总结。我对他的内容进行了随机翻译。原文可以在这里查看1.Symlink"stolen"fromfocusaurus/express_code_structure#the-app-symlink-trick在应用的node_modules文件夹下创建一个symlinkLinux:ln-nsfnode_modulesappWindows:mklink/Dappnode_modules(注:如果你在application目录下,你应该使用它,以bash为例cdnode_modules&&ln-nsf[modulepath],玩的时候请把app换成你要复制的模块的路径)然后就可以了varArticle=require('app/article');提示:由于git无法处理跨平台符号链接,因此您不能再在git存储库中使用此类文件。但是如果你在clone之后创建一个符号链接,git-hook或者由开发者手动创建,那么就没有问题了。另外,你可以在npm中添加一个postinstallhook,这个方法是scharf提出的。您可以向package.json添加命令fs.exists(d,function(e){e||fs.symlinkSync(s,d,'dir')});\""}(charsiupackage注释:postinstall会在npmruninstall之前自动执行)2.在你的应用中添加全局变量global.__base=__dirname+'/';所以你可以像这样使用它varArticle=require(__base+'app/models/article');3.使用其他人开发的库这是下一个建议4.环境变量将环境变量NODE_PATH设置为指向您要在应用程序中使用的模块的路径(在作者的例子中是.)。(叉烧包点评:还是用绝对路径比较安全)然后就可以varArticle=require('app/models/article');4.1提前设置确保在启动应用程序之前已经设置了环境变量Linux:exportNODE_PATH=.Windows:setNODE_PATH=.export和set的使用只对当前shell有效。如果你需要全局和永久地改变它,你需要修改你的配置文件。4.2仅在执行node时设置此方法不会影响您的环境,除非node正在运行。它要求您更改应用程序启用命令。像这样启动你的appLinux:NODE_PATH=.nodeapp.jsWindows:cmd.exe/C"setNODE_PATH=.&&nodeapp.js"(如果你在win下path和&&之间加一个空格,它不会启动)(注释onCharSiuPackage:这里推荐一个cross-env插件,可以跨平台使用命令,所以可以这样使用命令~cross-envNODE_PATH=.nodeapp.js)5.激活脚本其实差不多同4.2写个脚本运行,只是增加各种参数更方便。示例:Linux:./app(WindowsPowerShell可以)Windows:app5.1Node.js看这里的代码。#!/usr/bin/env节点'使用严格';varspawn=require('child_process').spawn;varargs=['--harmony','app/bootstrap.js'];varopt={cwd:__dirname,env:(function(){process.env.NODE_PATH='.';//Enablesrequire()callsrelativetothecwd:)//charsiew包注释:如果你需要多个路径,你可以这样做(需要额外的require路径模块)//process.env.NODE_PATH=['.','./lib'].join(path.delimiter)returnprocess.env;}()),stdio:[process.stdin,process.stdout,process.stderr]};varapp=spawn(process.execPath,args,opt);5.2特定于操作系统的启动脚本Linux可以创建一个app.sh#!/bin/shNODE_PATH=.nodeapp.jsWindows可以创建一个app.bat@echooffcmd.exe/C"setNODE_PATH=.&&nodeapp.js"6.HackThanks@joelabair几乎像4.2,但不需要在app之外指定NODE_PATH但是,因为这依赖于专用的Node.js核心方法。您需要在require之前运行此方法。process.env.NODE_PATH=__dirname;require('module').Module._initPaths();7.Package感谢@a-ignatov-parc简单地说,你可以在你的app.global.rootRequire的开头运行这样的代码=function(name){returnrequire(__dirname+'/'+name);}然后就可以这样了varArticle=rootRequire('app/models/article');叉烧包的总结是根据我的原理一直以来都是越快越好,打字越少越好,所以我个人认为symlink的方式受各种限制,你的package加一点就得重新出一个,我觉得uncomfortable=>pass添加了全局变量,但是还是需要自己拼接uncomfortable=>passenvironmentvariable,我可以接受写脚本0-0Hack方法的方法,我更喜欢这种方法,和使用时按原包装方式。需要的时候不舒服。我喜欢直接require...so=>pass包子的方法1.修改启用命令,上面4和5也有提到。运行NODE_PATH=。节点app.js启用时。但是不同操作系统下的路径分隔符肯定是考虑问题,所以我个人推荐使用5.1中的方法,写一个node脚本2.HACK我hack了_findPath()方法。这是设置别名为w,但是只能兼容到node6打包完成。成为插件node-require-alias,在这里推荐自己。使用方法:constpath=require("path")require('node-require-alias').setAlias({"@":path.join(__dirname,"this/is/a/path")})//或者require('node-require-alias').setAlias("@",path.join(__dirname,"this/is/a/path"))当需要模块时↓require('@/abc.js')欢迎来PR(づ ̄3 ̄)づ╭?~别人的方法hack了require方法。这与我认为的hack类似,但这种方式的兼容性更好。代码在这里。这个作者也已经封装成插件了,可以支持sexy-require。这里的别名是在package.json下配置的,导出方式是hack的。通过Object.defineProperty,在使用get方法时,为模块添加必要的属性babel-plugin-resolver。这个包我没有详细了解,所以使用它的人可以自己看一下插件。如果你用过,请在评论里告诉我~(@^_^@)~和原来的没什么区别。惭愧先不好意思,看自己的插件node-require-alias,node6.0及以上环境,读package.json配置的sexy-requiremodule-alias。可以通过阅读package.json设置别名来使用,通过methods和原来的不一样,因为我个人不喜欢这种写法,这里就不介绍了。我只推荐require-aliasapp-module-path。最后的总结是我个人的对比。我更喜欢自己写还是更喜欢HACK!不过我觉得加环境变量也很快,完全不用担心兼容性问题b( ̄▽ ̄)d。另外,我也很随意的分析了一下HACK方法的原理。如果你想看,你可以点击这里