• home > webfront > ECMAS > npm-node >

    系统环境变量:Node.js环境变量在前端工程配置上的作用

    Author:zhoulujun Date:

    OS(Operate System)中文译为操作系统,本质上就是一个巨大的软件。每个进程都有其各自的环境变量设置。 是nodeJS中的全局对象global上的一个进程属性。process env属性返回一个包含用户环境信息的对象

    就是我们的OS(Operate System)中文译为操作系统,本质上就是一个巨大的软件

    这个电脑上运行的系统其实就是一个巨大的程序,这个程序可能就是 Windows,Linux,Mac 系统中的一种。但是本质都是程序,在这个程序里面有个环境变量。我们姑且称这个操作系统叫做妈妈吧。环境变量就是这个妈妈本身的变量。你运行其他程序的时候都是需要这个妈妈的变量,大家一起用。这就很像其他编程语言一样,就是个变量。看看维基百科对系统环境变量的介绍。

    系统环境变量

    环境变量是一个动态命名的值,可以影响计算机上进程的行为方式。例如一个正在运行的进程可以查询TEMP环境变量的值,以发现一个合适的位置来存储临时文件,或者查询HOME或USERPROFILE变量,以找到运行该进程的用户所拥有的目录结构。

    在所有 UNIX 和 类Unix系统中, 每个进程都有其各自的环境变量设置。 缺省情况下, 当一个进程被创建时, 除了创建过程中的明确更改外,它继承了其父进程的绝大部分环境设置。 在API层级上, 使用fork和exec函数进行变量设置。或利用bash shell文件, 使用特殊的命令调用来改变环境变量:通过Env 间接替代或者使用ENVIRONMENT_VARIABLE=VALUE <command> 标识. 所有的UNIX操作系统 以及DOS 和Microsoft Windows 都是用环境变量,但是它们使用不同的环境变量名称。我们可以通过运行程序来访问环境变量的值。

    环境变量的例子包括:

    • PATH 罗列出 shell 搜索 用户 输入的执行命令所在的目录。

      Linux有很多命令,你常用的cd,pwd,cp,mkdir这些命令都是储存在 /usr/bin 里,查看:ll /usr/bin  

    • HOME (类Unix系统) 和 userprofile (Microsoft Windows) 表示用户的家目录在文件系统中的位置。

    • TERM (类Unix系统) 指定使用终端或虚拟终端 的类型 (如, vt100 或 终端)。

    • CVS_RSH (类Unix系统) 该选项可用于 ext 方式中指明 cvs 客户端寻找远端 shell 的路径,用作连接 cvs 服务器和以更高的优先权覆盖 $CVS_RSH 环境变量中指定的路径。

    • MAIL (类Unix系统) 当前用户的邮件存放目录。

    Windows

    Windows“环境变量”是微软从DOS到Windows 10操作系统一脉相承的一种基本变量,它可以被系统功能组件、软件或用户调用。

    除了如上所述的控制系统临时文件夹的环境变量TEMP外,环境变量还有许多,我们可以通过命令提示符窗口,输入SET命令查看所有可用的系统环境变量(图1)。注意:各行等号前为环境变量,等号后是该环境变量代表的具体路径或值。

    C:\Windows\system32>set test=demo

    通过图形界面添加,这里不展开介绍了,文章不要太多。

    linux/uninx/mac

    printenv或者env可以把PC所有的环境变量打印出来。

    设置新的环境变量

    设置临时环境变量
    export NEWSAMPLE="sample" # 设置新的临时环境变量
    echo $NEWSAMPLE # 在当前的窗口打印一下看看
    设置永久环境变量

    添加给当前用户

    vi ~./zshrc  # 写入  
    export NEWSAMPLE="sample"   # 添加保存  
    source ~/.zshrc # 立即生效

    所有用户

    vi /etc/profile # 写入  
    export NEWSAMPLE="sample" # 添加保存


    什么是临时环境变量?

    简单的理解就是你现在这个命令窗口的变量,等你新开一个命令窗口,那么这个变量就不复存在,无法使用。这样的概念类似于函数的局部变量无法全部使用的感觉一样。


    如何从 Node.js 读取环境变量

    process是nodeJS中的全局对象global上的一个进程属性。具体查看:http://nodejs.cn/api/process.html

    env是process上的一个代表环境变量的属性,所有设置的环境变量都可以通过该属性读取。

    Node.js 的 process 核心模块提供了 env 属性,该属性承载了在启动进程时设置的所有环境变量。

    这是访问 NODE_ENV 环境变量的示例,该环境变量默认情况下被设置为 development。

    process.env.NODE_ENV // "development"

    在脚本运行之前将其设置为 "production",则可告诉 Node.js 这是生产环境。

    http://nodejs.cn/learn/how-to-read-environment-variables-from-nodejs

    process.env属性返回一个包含用户环境信息的对象。 具体参看:http://nodejs.cn/api/process.html#process_process_env


    nodejs修改环境变量放到方法

    修改操作系统环境变量(不推荐)

    零时修改nodejs环境变量

    on Windows:

    set NODE_ENV=dev

    on OS X or Linux:

    export NODE_ENV=dev


    永久修改nodejs环境变量

    vim /etc/profile 进行修改

    直接写在js文件:

    process.env.NODE_ENV = 'production';

    写在在package.json:

    {
      "scripts": {
        "start": "set NODE_ENV=dev && node app.js"
      }
    }


    cross-env

    cross-env 是运行跨平台设置和使用环境变量的脚本

    https://www.npmjs.com/package/cross-env

    这个迷你的包能够提供一个设置环境变量的scripts,让你能够以unix方式设置环境变量,然后在windows上也能兼容运行。

    如:

    {
      "scripts": {
        "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js"
      }
    }

    cross-env 也可以理解为一个 npm的插件,他可以处理 windows 和其他 unix 系统在设置环境变量的写法上不一致的问题。


    NODE_ENV

    NODE_ENV是一个常量名。它的独特点是,在webpack4.0+中,打包配置文件中有个属性:

    mode: "production" 或者 mode: "development"

    实质上是暗中完成了一个自定义变量设置:

    plugins: [
        new webpack.definePlugin({
          'process.env.NODE_ENV': JSON.stringify("production") // 或者 "development"
        }),
        ...
    ]



    在webpack4.0之前的版本中一般是在package.json的scripts中命令中设置NODE_ENV的值。

    "start": "cross-env NODE_ENV=development webpack-dev-server --open --config webpack.dev.js",    
    "build": "cross-env NODE_ENV=production webpack --config webpack.prod.js"

    然后在手动定义变量:

    plugins: [
        new webpack.definePlugin({
          'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
        }),
        ...
    ]


    custom-env

    如何为不同的环境阶段自定义Node.js .env文件,如vue-cli通过各种 环境配置

    vue-cli env文件处理不同版本配置问题

    Custom env是一个库,旨在通过允许针对不同环境的多个.env配置来简化开发。 这是通过将环境变量从.env.envname文件加载到节点的process.env对象中来完成的。

    require('custom-env').env()

    具体参看 https://www.npmjs.com/package/custom-env





    参考文章;

    简单易懂解说「到底什么是环境变量?」 https://chihokyo.com/post/6/

    了解process.env.NODE_ENV https://juejin.cn/post/6873062850089680904

    Node.js中环境变量process.env详解 https://www.cnblogs.com/zdz8207/p/nodejs-process-env.html

    如何为不同的环境阶段自定义Node.js .env文件 https://blog.csdn.net/cumian9828/article/details/108156408

    Node环境变量 process.env 的那些事儿 https://segmentfault.com/a/1190000011683741




    转载本站文章《系统环境变量:Node.js环境变量在前端工程配置上的作用》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/nodejs/8678.html