npm脚本:使用节点但未使用babel

时间:2018-11-26 23:51:44

标签: node.js babel npm-scripts pnpm

在我的第一个npm脚本开发的早期,有些挣扎。我正在使用最新的nvm,node,npm和pnpm版本的Ubuntu LTS。

已使用nvm安装了Node + npm,使用npm安装了pnpm,并使用pnpm在本地安装了几个模块(即,没有-g标志)。不需要sudo。产生的package.json:

{
  "name": "javascript-development-environment",
  "version": "1.0.0",
  "description": "JavaScript development environment cobbled together using various online sources",
  "scripts": {
    "prestart": "./node_modules/.bin/babel buildScripts/startMessage.js",
    "start": "./node_modules/.bin/babel buildScripts/srcServer.js"
  },
  "author": "Laird o' the Windy Waas",
  "license": "MIT",
  "dependencies": {
    "@babel/polyfill": "^7.0.0"
  },
  "devDependencies": {
    "@babel/cli": "^7.1.5",
    "@babel/core": "^7.1.6",
    "@babel/preset-env": "^7.1.6",
    "chalk": "^2.4.1",
    "express": "^4.16.4",
    "open": "^0.0.5",
    "path": "^0.12.7"
  }
}

仅安装Firefox 60.0.1,然后使用 node 进行“ pnpm start”,打开浏览器窗口“ Hello World!”。 ,然后必须使用CTRL-C重新获得终端控制。 ->好的。

如果我使用上面显示的路径替换babel (这是由this post中描述的相同问题导致的),则buildScripts代码将回显到终端,但没有浏览器窗口打开,并在完成后立即释放终端控制。 npm调试器没有提供有用的反馈。 ->无法正常工作。.

作为“ Hello World!”使用node正确遍历了代码(对于babel遍历来说,它保持不变),这不是问题的根源。

这是我的babel配置文件:

.babelrc

{
  "presets": [
    "@babel/preset-env"
  ]
}

babel.config.js

const presets = [
      [
        "@babel/env",
        {
          targets: {
            edge: "17",
            firefox: "61",
            chrome: "67",
            safari: "11.1",
            opera: "56"
          },
          useBuiltIns: "usage"
        },
      ],
    ];

    module.exports = { presets };

问题似乎是babel没有将已转码的代码传递给nodejs / express。一定很简单,但我只是转圈。。

我发现自己想问的一件事是.babelrcbabel.config.jspackage.json上的各种环境预设之间是否存在冲突。 .babelrcbabel.config.js文件的连续存放没有带来任何改变/提前。

我还注意到当前同时安装了(nvms)节点和(ubuntus)nodejs:

$ which node
/home/<myusername>/.nvm/versions/node/v10.13.0/bin/node

$ which nodejs
/usr/bin/nodejs

但是,与节点和npm有关的所有操作都是使用nvm安装的,因此此shouldn't be a problem

我想我可以尝试installing babel globally,但是有了这个皱着眉头的啤酒。我希望有一个反映“最佳实践”的解决方案。

谢谢您的建议。

1 个答案:

答案 0 :(得分:1)

在较早的几年中,辅导材料建议babel-node代表用户开始npm / node(因此也express)开始。

babel-node现在似乎不再被识别。尝试使用babel-node命令失败,仅在其位置使用node会导致将Transpiler输出转储到终端。

现在必须显式调用

babel(在我们的示例中为pnpmnode,后者引用已转译的代码。 node似乎可以处理与express的接口。

因此,在进行一些实验之后,以下更改(在package.json中似乎可以正常工作:

  "scripts": {
    "prestart": "./node_modules/.bin/babel buildScripts/startMessage.js -d dist",
    "build": "./node_modules/.bin/babel buildScripts/srcServer.js -d dist",
    "start": "pnpm run build && node dist/startMessage.js && node dist/srcServer.js"
  },

这些结果都在整洁的控制台输出中 都在“ Hallo World!”中产生在新打开的浏览器窗口中显示。

只希望这对其他人有用。;-)