【问题标题】:MeteorJS javascript function defined in package is undefined包中定义的 MeteorJS javascript 函数未定义
【发布时间】:2020-09-11 03:57:39
【问题描述】:

我在 Meteor 中创建了一个自定义包,将 javascript 添加到应用程序中。

我的package.js

Package.describe({
    name: 'markel:theme',
    version: '1.0.0',
    summary: 'Theme package',
});

Package.onUse(function(api) {
    // Import all JS files required by the template

    api.addFiles(['assets/js/custom.js']);
});

custom.js:

function theme_test() {
    console.log('Theme test');
}

meteor 在应用程序中加载包时,会将函数放在IIFE 中。所以javascript在(function(){here})。所以我的函数将返回 undefined。

我如何定义该函数并使用它?

【问题讨论】:

  • 您打算导入它吗?请描述你打算用它做什么。
  • @Jankapunkt 我想使用我在 custom.js 中定义的函数。因此,如果我在模板助手中调用 theme_test() ,它会将“主题测试”记录到控制台。
  • 但无论是导出还是添加到全局范围,代码都没有显示。您示例中的 IIFE 部分很难掌握。您可以扩展代码以便轻松重现吗?
  • @Jankapunkt 如果您知道如何安装本地软件包,这就是您重现它所需的一切。
  • 我的意思是,您如何使theme_test 可用于您的项目?通常你要么使用export,要么将它添加到global,在这个例子中它只是在custom.js的范围内,没有办法在这个模块之外使用它。

标签: javascript meteor package meteor-blaze


【解决方案1】:

我希望这些选项之一能解决您的问题,因为我发现很难重现任何 undefined 值。

选项 1 - 使用模块

虽然您可以通过 api.addFiles 自动添加文件,但您仍然可以选择显式导出它们:

package.js

Package.describe({
    summary: 'Theming',
    version: '1.0.0',
    name: 'marcelweidum:theme',
    git: 'https://github.com/MarcelWeidum/stack-question.git'
});

Package.onUse((api) => {
    api.use('ecmascript') // required to use import/export
    api.addFiles([
        'js/custom.js'
    ], 'client');
    api.mainModule('main.js')
});

package/js/custom.js

export const theme_test = function theme_test () {
    console.log('Here am I!');
}

console.log('Loaded');

package/main.js(在包的根文件夹中)

export { theme_test } from './js/custom'

client/main.js

import { theme_test } from 'meteor/marcelweidum:theme'
theme_test()

会在控制台上给你:

Loaded
Here am I! 

选项 2 - 使用 api.export

您可以使用隐式全局导出主题,该全局可使用api.export 立即访问:

package.js 包.描述({ 摘要:“主题”, 版本:'1.0.0', name: 'marcelweidum: 主题', 混帐:'https://github.com/MarcelWeidum/stack-question.git' });

Package.onUse((api) => { api.addFiles([ 'js/custom.js' ], '客户'); api.export('我的主题') });


*package/js/custom.js*

函数主题测试(){ console.log('我在这里!'); }

我的主题 = 我的主题 || {} MyTheme.theme_test = 主题测试

console.log('加载');


*client/main.js*
```javascript
MyTheme.theme_test()

会在控制台上给你:

Loaded
Here am I! 

选项 3 - 显式导入文件

这将仅在文件导入时悬停加载文件的内容

package.js 包.描述({ 摘要:“主题”, 版本:'1.0.0', name: 'marcelweidum: 主题', 混帐:'https://github.com/MarcelWeidum/stack-question.git' })

Package.onUse((api) => { api.use('ecmascript') })


*js/custom.js* (in root folder of the package)
```javascript
export const theme_test = function theme_test () {
    console.log('Here am I!');
}

console.log('Loaded');

package/js/custom.js

export const theme_test = function theme_test () {
    console.log('Here am I!');
}

console.log('Loaded');

client/main.js

import { theme_test } from 'meteor/marcelweidum:theme/js/custom'
theme_test()

会在控制台上给你:

Loaded
Here am I! 

选项 4 使用 bare 选项,以防文件被编译器插件使用:

如果您不希望将文件包装在闭包中,例如因为它将被自定义编译器插件使用,则添加 bare 选项:

Package.describe({
    summary: 'Theming',
    version: '1.0.0',
    name: 'marcelweidum:theme',
    git: 'https://github.com/MarcelWeidum/stack-question.git'
});

Package.onUse((api) => {
    api.addFiles([
        'js/custom.js'
    ], 'client',  { bare: true });
});

这仍然会加载文件,但您必须使用 isobuild 插件来处理文件。

【讨论】:

  • 只有选项 1 有效,但对每个功能都这样做是不可行的。例如:如果我想在我的包中加载 bootstrap.js,我不能为 .tooltip() 制作导出和其他所有功能。我知道已经有一个引导程序包,但这只是一个例子。
  • 如果你想要 Bootstrap tooltoip 类,你可以使用选项 3:import { Tooltip } from 'bootstrap/js/src',它会为你导入 class Tooltip
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2011-09-25
  • 2012-07-04
  • 2011-05-21
  • 2017-06-06
  • 1970-01-01
  • 2018-01-14
相关资源
最近更新 更多