如何防止在流星客户端上加载Sharp模块?

时间:2018-09-17 16:06:55

标签: meteor webpack sharp

我在服务器的图片集中使用了npm pkg Sharp来转换img。服务器代码是这样的:

import * as sharp from 'sharp';

export const Pictures = new Mongo.Collection('pictures');

export const PicturesStore = new UploadFS.store.GridFS({
    collection: Pictures,
    name: 'pictures',
    filter: new UploadFS.Filter({
        contentTypes: [ 'image/*' ],
    }),
    transformWrite(from, to, fileId, file) {
        const transform = sharp().resize(300, 300).min().crop().toFormat('jpeg', { quality });
        from.pipe(transform).pipe(to);
    },
})

但是在客户端上,它报告错误:

cannot load native .node modules on the client.

客户端实际上并不运行敏锐的功能。它仅指PicturesStore,还为Pictures创建一个minimongo集合。

在另一个项目中,它在客户端上使用webpack。可以配置为使用空的虚拟对象来解决锐利问题。

但是如何创建一个空的虚拟Sharp对象,以防止在没有Webpack的流星客户端上加载Sharp模块?

1 个答案:

答案 0 :(得分:1)

原来,您必须编写一个Meteor包来定义客户端和服务器上加载的不同文件。在package.js中,就像这样:

Package.onUse(function (api) {
    api.mainModule('sharp-client.js', 'client');
    api.mainModule('sharp-server.js', 'server');
});

在sharp-client.js中,就像这样:

export var Sharp = {};

在Sharp-server.js中,就像这样:

import {
    checkNpmVersions
} from 'meteor/tmeasday:check-npm-versions';

checkNpmVersions({
    'sharp': '^0.20.5'
}, 'my:awesome-package');

export var Sharp = require('sharp');

完成。