【问题标题】:How can I exclude certain node_modules from Meteor's client side bundle?如何从 Meteor 的客户端包中排除某些 node_modules?
【发布时间】:2017-03-15 06:52:41
【问题描述】:

Meteor 1.3 开始,npm 是推荐的打包系统,我现在在我的node_modules 目录中同时拥有服务器端和客户端包。 Meteor 试图将所有这些捆绑到一个巨大的 modules.js 文件中。

让流星完全忽略文件的唯一方法似乎是更改文件或目录名称(12)。

但我不想完全忽略这些文件 - 有些模块我只需要在服务器端,有些只在客户端。

有没有办法让 Meteor 只在客户端包中包含某些节点模块,可能是通过创造性命名或黑客 .babelrc

【问题讨论】:

  • 从 1.3 版开始,Meteor 有了一个不错的模块系统,你可以使用新的 ES6 语法 (read here) 来import ... 任何你想要的东西。由于一切都是“选择加入”,现在没有必要“退出”任何东西。
  • @apendua 是对的,但我发现您需要一些棘手的模式来防止 Meteor 在仅服务器代码中查找导入并将它们捆绑到客户端。基本上,Meteor 不尊重运行时条件测试Meteor.isServer,因此您需要将内容隐藏在“服务器”文件夹中。

标签: meteor npm babeljs


【解决方案1】:

所有内容都需要放入您放置在服务器上的捆绑包中。当您访问您的网站时,服务器使您的 HTML、CSS 和 JS 可用并被加载到浏览器中。仅加载浏览器所需的节点模块。

没有必要这样做:)

【讨论】:

  • module.js 正在加载我认为我只在服务器端使用的东西。例如,Winston logging,它是一个服务器端的日志包。
  • 不,一切都不需要进入捆绑包。是的,有必要这样做。例如,您可能会使用许多 npm 模块专门执行服务器端工作,例如渲染电子邮件模板并发送它们、与您的支付网关通信、生成 PDF 等。在我的情况下,这占发送到客户端的 2MB javascript无缘无故。
【解决方案2】:

将它们隐藏在 server 文件夹中并间接导入。

要排除某些 npm node_modules 被捆绑到大量 modules.js 文件中,并防止将无用兆字节的脚本发送到客户端:有条件地 require 一个文件server 文件夹中的 imports 模块。

像这样:

/* /my-import-file.js */

import { Meteor } from 'meteor/meteor';

if (Meteor.isServer) {
  module.exports = require('./server/server-only-file');
}

以及实际导入大型、无用的客户端 npm 模块的文件:

/* /server/server-only-file.js */

// Import some modules that will NOT be sent to the client
import mailgun from 'mailgun.js';
import cheerio from 'cheerio';
import juice from 'juice';

export { juice, cheerio, mailgun };

您的其他代码可以这样做:

import { Meteor } from 'meteor/meteor';
import myImport from '/my-import-file'

if(Meteor.isServer){
  myImport.doServerOnlyStuff();
}

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 2015-11-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    相关资源
    最近更新 更多