如何基于节点模块从 JavaScript 文件创建构建?

How can I create a build from a JavaScript file based on node modules?

我使用

创建了一个新节点项目
npm init
npm install apollo-server

然后我使用以下代码添加了一个 index.js 文件:

const { ApolloServer, gql } = require('apollo-server');

const typeDefs = gql`
  type Query {
    hello: String
  }
`;

const server = new ApolloServer({
  typeDefs,
  mocks: true,
});

server.listen().then(({ url }) => {
  console.log(` Server ready at ${url}`)
});

虽然我可以 运行 使用 node index.js,但我实际上如何从我的 index.js 创建构建,所以它在 运行 期间不直接需要模块时间? (目标:将其部署在 render.com 等平台上)

听起来您想创建一个不需要 server-side 配置或设置 运行 的可执行工件。

对此有几个选项。您可能正在寻找 Javascript 捆绑器,例如 Rollup, Parcel or Webpack。 Webpack 是使用最广泛的,但通常也是最难配置的。

使用捆绑器

包裹

使用 npm i -g parcel 安装 Parcel,然后将其添加到您的 package.json:

  "main": "dist/index.js",
  "targets": {
    "main": {
      "includeNodeModules": true
    },
  },

然后运行parcel build index.js。就是这样!

我添加了一个简单的 demo on GitHub

Webpack

有多个great answers on this SO question

捆绑器注意事项

许多节点包都带有 binary/native addons. For example, Cypress 下载并安装浏览器。任何使用本机插件的包都不能与捆绑器一起工作,因为捆绑器无法添加二进制文件。这些包仍然需要安装。

另一种选择:构建二进制文件

在上述过程中,您的输出工件是单个 Javascript 文件。除了 Javascript 文件,您还可以生成一个二进制文件,从而减少安装 Node 运行 的需要。查看 pkg 来执行此操作。虽然 pkg 是一个相当成熟的产品,但通常仍被认为是一项实验性技术,因此可能不适合生产环境。另一方面,您不应该 运行 解决包含本机插件的软件包的任何问题。阅读文档以查看它是否适合您的用例。

https://github.com/vercel/ncc 这可能会有所帮助。它在最终工件

中包含 node_modules