我一直认为,关于如何用Babel创建一个最小的Node.js应用程序,没有什么常识性的规则。在我寻找这些答案的过程中,似乎我遇到的每一个教程都显示了不同的东西。因此,我想为我的读者和我自己简化这个项目设置,所以我开发了一个使用Babel的Node.js应用程序的通用方法。
我坚信这是一个很好的基础,可以在命令行上学习JavaScript,在它上面建立复杂的Node.js项目,将它作为node包(库)发布在npm上作为一个开源项目,或者在它上面建立一个RESTful或GraphQL服务器。你在这里要实现的最终项目可以在这个GitHub仓库中找到。
使用Nodemon的Node.js
到目前为止,你已经能够通过运行npm start脚本来启动你的应用程序。剩下的唯一问题是,每次你想尝试你的源代码时,你都必须启动该脚本。你可以用一个始终运行的node进程来改变这种行为。为了解决这个问题,在命令行上安装常用的nodemon库,作为开发依赖关系到你的项目。
npm install nodemon --save-dev
接下来,在你的npm启动脚本中用nodemon交换node:
{
...
"main": "index.js",
"scripts": {
"start": "nodemon src/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
...
}
当你用npm start ,从命令行运行你的应用程序时,它应该一直运行。最重要的是,一旦你改变了源代码,该脚本将再次执行。试着在src/index.js文件中调整你的源代码,看看你的命令行中会发生什么。
console.log('Hello ever running Node.js project.');
这个对环境的小调整给了开发者一个强大的工具,因为一旦你改变了你的代码,node进程就会再次执行。如果你引入了一个bug,你会在命令行中看到一个堆栈跟踪,并且脚本会再次运行,没有任何缺陷。
使用Babel的Node.js
你现在应该能够开发一个Node.js应用程序了,但要建立一个复杂的Node.js项目,能够使用最近的JavaScript语言特性(ECMAScript),而这些特性并不包括在最近的Node.js版本中,还有更多的内容。这就是Babel变得有用的地方。你可以从命令行中安装它,作为你项目的开发依赖。
npm install @babel/core @babel/node --save-dev
接下来,把它添加到你的npm启动脚本中。
{
...
"main": "index.js",
"scripts": {
"start": "nodemon --exec babel-node src/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
...
}
当你再次运行应用程序时,应该没有什么变化,尽管这只是表面现象。在引擎盖下,Babel将你的代码移植到普通的JavaScript。当你使用一个即将到来的JavaScript语言功能,而这个功能在Node.js中还没有被引入,你仍然可以在你的源代码中使用该功能。Babel确保Node.js能够理解它。然而,要用Babel包含即将到来的语言功能,还有一个关键步骤。你可以通过把不同的即将到来的JavaScript功能作为预置添加到Babel中来激活它们。让我们把最常用的Babel预置添加到你的应用程序中:
npm install @babel/preset-env --save-dev
现在,在项目的根目录下,在命令行中创建一个*.babelrc*文件:
touch .babelrc
在这个Babel的配置文件中,你可以包括最近安装的依赖,以解锁即将到来的JavaScript语言功能:
{
"presets": [
"@babel/preset-env"
]
}
现在你可以在你的src/index.js文件中包含即将到来的JavaScript特性。如果你遇到了问题,因为你想要的功能无法使用,请检查是否存在专门的Babel预设。
Node.js中的环境变量
将私人API密钥和用户凭证(如密码、用户名和电子邮件)等数据设置为环境变量是很重要的,但不能在源代码中暴露它们。为此,我们将环境变量放在一个专门的文件中,以避免外部访问。.env文件让你设置Node.js环境变量,以便在你的项目源代码中访问。在命令行中,在你项目的根文件夹中,创建一个*.env*文件。
touch .env
现在你可以将任何你不希望在源代码中出现的键值对放在这个新文件中。
MY_SECRET=mysupersecretpassword
dotenv是另一个有用的库,可以使环境变量在源代码中被访问。首先,把它作为一个正常的依赖项安装在命令行上。
npm install dotenv --save
其次,将其导入你的src/index.js文件以初始化它。你的*.env*文件中的环境变量现在可以在你的源代码中访问。
import 'dotenv/config';
console.log('Hello Node.js project.');
console.log(process.env.MY_SECRET);
再次启动npm脚本,你应该在命令行中看到这个环境变量。现在你能够将敏感数据与源代码分开存储。
现在,考虑一下你的src/index.js文件的以下代码,其中一个函数是从这个项目的另一个文件导入的。
import saySomething from './my-other-file.js'
import 'dotenv/config';
如果你在你的src/my-other-file.js中使用了一个环境变量,那么它是未定义的,因为dotenv包的初始化发生在你的src/index.js文件的导入之后。要解决这个问题,请将dotenv的初始化放在你的本地文件导入之前。
import 'dotenv/config';
import saySomething from './my-other-file.js'
这是对Node.js环境变量的一个基本理解。它们应该被用来保证JavaScript应用程序中敏感数据的安全,但在使用git时,不应该在公共的GitHub存储库中共享。
本指南向您展示了如何从头开始创建一个Node.js项目,以及如何使用Babel在Node.js环境中引入即将到来的JavaScript特性。你已经看到了npm脚本如何用于启动、测试和部署应用程序,以及环境变量如何保护敏感数据,如私人API密钥和用户凭证。完成的产品是一个可以在npm上开源的node包,这是与Node.js生态系统合作的另一个有益方面。