Javascript meteor:导入目录-模块化导入所需的方法
我正在将我的meteor应用程序迁移到meteor 1.3的导入功能 但我认为这并不是最好的方式。难道不能加载/导入真正需要的方法吗? 我的意思是,现在所有的方法都是通过导入methods.js来加载的。但我想以模块化的方式来做。因此,如果应用程序中使用了表单Javascript meteor:导入目录-模块化导入所需的方法,javascript,meteor,import,module,ecmascript-6,Javascript,Meteor,Import,Module,Ecmascript 6,我正在将我的meteor应用程序迁移到meteor 1.3的导入功能 但我认为这并不是最好的方式。难道不能加载/导入真正需要的方法吗? 我的意思是,现在所有的方法都是通过导入methods.js来加载的。但我想以模块化的方式来做。因此,如果应用程序中使用了表单.fomNewElement,则将导入方法插入项目,依此类推。不仅仅是加载所有内容 下面您可以看到我的/imports文件夹结构和文件的一些内容。结构本身还有什么我可以改进的吗 如果导入依赖于用户角色,那也太好了。这可能吗 导入/api/a
.fomNewElement
,则将导入方法插入项目
,依此类推。不仅仅是加载所有内容
下面您可以看到我的/imports
文件夹结构和文件的一些内容。结构本身还有什么我可以改进的吗
如果导入依赖于用户角色,那也太好了。这可能吗
导入/api/article/client/article.js
import { Articles } from '../';
import { insertArticle, updateArticle } from '../methods.js';
Template.Articles.helpers({
// some helpers
});
Template.Artilces.onCreated(function() {
// some code
});
Template.Artilces.onRendered(function() {
// some code
});
Template.Articles.events({
'submit .formNewElement': function(event) {
event.preventDefault();
var title = event.target.title.value.trim();
insertArticle.call({
title: title
});
},
'click .anything': function() {}
});
export const Articles = new Mongo.Collection('articles');
import { Articles } from './';
export const insertArticle = new ValidatedMethod({
name: 'article.insert',
validate: new SimpleSchema({
title: { type: String }
}).validator(),
run( document ) {
Articles.insert( document );
}
});
export const updateArticle = new ValidatedMethod({
name: 'article.update',
validate: new SimpleSchema({
_id: { type: String },
'update.title': { type: String }
}).validator(),
run( { _id, update } ) {
Articles.update( _id, { $set: update } );
}
});
import '../../api/redactor-article/client';
import '../../api/redactor-article/server/publications.js';
import '../../api/redactor-article/methods.js';
import './article.html';
import './article.sass';
import './article.js';
如您所见,我将所有helpers、events和onCreated/onRendered代码都放入该js文件中。希望这是“正确的”。。。如果这不是很聪明,请给我一些提示
导入/api/article/index.js
import { Articles } from '../';
import { insertArticle, updateArticle } from '../methods.js';
Template.Articles.helpers({
// some helpers
});
Template.Artilces.onCreated(function() {
// some code
});
Template.Artilces.onRendered(function() {
// some code
});
Template.Articles.events({
'submit .formNewElement': function(event) {
event.preventDefault();
var title = event.target.title.value.trim();
insertArticle.call({
title: title
});
},
'click .anything': function() {}
});
export const Articles = new Mongo.Collection('articles');
import { Articles } from './';
export const insertArticle = new ValidatedMethod({
name: 'article.insert',
validate: new SimpleSchema({
title: { type: String }
}).validator(),
run( document ) {
Articles.insert( document );
}
});
export const updateArticle = new ValidatedMethod({
name: 'article.update',
validate: new SimpleSchema({
_id: { type: String },
'update.title': { type: String }
}).validator(),
run( { _id, update } ) {
Articles.update( _id, { $set: update } );
}
});
import '../../api/redactor-article/client';
import '../../api/redactor-article/server/publications.js';
import '../../api/redactor-article/methods.js';
import './article.html';
import './article.sass';
import './article.js';
导入/api/article/methods.js
import { Articles } from '../';
import { insertArticle, updateArticle } from '../methods.js';
Template.Articles.helpers({
// some helpers
});
Template.Artilces.onCreated(function() {
// some code
});
Template.Artilces.onRendered(function() {
// some code
});
Template.Articles.events({
'submit .formNewElement': function(event) {
event.preventDefault();
var title = event.target.title.value.trim();
insertArticle.call({
title: title
});
},
'click .anything': function() {}
});
export const Articles = new Mongo.Collection('articles');
import { Articles } from './';
export const insertArticle = new ValidatedMethod({
name: 'article.insert',
validate: new SimpleSchema({
title: { type: String }
}).validator(),
run( document ) {
Articles.insert( document );
}
});
export const updateArticle = new ValidatedMethod({
name: 'article.update',
validate: new SimpleSchema({
_id: { type: String },
'update.title': { type: String }
}).validator(),
run( { _id, update } ) {
Articles.update( _id, { $set: update } );
}
});
import '../../api/redactor-article/client';
import '../../api/redactor-article/server/publications.js';
import '../../api/redactor-article/methods.js';
import './article.html';
import './article.sass';
import './article.js';
以及其他文件:
导入/startup/client/index.js
import { Articles } from '../';
import { insertArticle, updateArticle } from '../methods.js';
Template.Articles.helpers({
// some helpers
});
Template.Artilces.onCreated(function() {
// some code
});
Template.Artilces.onRendered(function() {
// some code
});
Template.Articles.events({
'submit .formNewElement': function(event) {
event.preventDefault();
var title = event.target.title.value.trim();
insertArticle.call({
title: title
});
},
'click .anything': function() {}
});
export const Articles = new Mongo.Collection('articles');
import { Articles } from './';
export const insertArticle = new ValidatedMethod({
name: 'article.insert',
validate: new SimpleSchema({
title: { type: String }
}).validator(),
run( document ) {
Articles.insert( document );
}
});
export const updateArticle = new ValidatedMethod({
name: 'article.update',
validate: new SimpleSchema({
_id: { type: String },
'update.title': { type: String }
}).validator(),
run( { _id, update } ) {
Articles.update( _id, { $set: update } );
}
});
import '../../api/redactor-article/client';
import '../../api/redactor-article/server/publications.js';
import '../../api/redactor-article/methods.js';
import './article.html';
import './article.sass';
import './article.js';
导入/startup/server/index.js
import { Articles } from '../';
import { insertArticle, updateArticle } from '../methods.js';
Template.Articles.helpers({
// some helpers
});
Template.Artilces.onCreated(function() {
// some code
});
Template.Artilces.onRendered(function() {
// some code
});
Template.Articles.events({
'submit .formNewElement': function(event) {
event.preventDefault();
var title = event.target.title.value.trim();
insertArticle.call({
title: title
});
},
'click .anything': function() {}
});
export const Articles = new Mongo.Collection('articles');
import { Articles } from './';
export const insertArticle = new ValidatedMethod({
name: 'article.insert',
validate: new SimpleSchema({
title: { type: String }
}).validator(),
run( document ) {
Articles.insert( document );
}
});
export const updateArticle = new ValidatedMethod({
name: 'article.update',
validate: new SimpleSchema({
_id: { type: String },
'update.title': { type: String }
}).validator(),
run( { _id, update } ) {
Articles.update( _id, { $set: update } );
}
});
import '../../api/redactor-article/client';
import '../../api/redactor-article/server/publications.js';
import '../../api/redactor-article/methods.js';
import './article.html';
import './article.sass';
import './article.js';
导入/api/article/client/index.js
import { Articles } from '../';
import { insertArticle, updateArticle } from '../methods.js';
Template.Articles.helpers({
// some helpers
});
Template.Artilces.onCreated(function() {
// some code
});
Template.Artilces.onRendered(function() {
// some code
});
Template.Articles.events({
'submit .formNewElement': function(event) {
event.preventDefault();
var title = event.target.title.value.trim();
insertArticle.call({
title: title
});
},
'click .anything': function() {}
});
export const Articles = new Mongo.Collection('articles');
import { Articles } from './';
export const insertArticle = new ValidatedMethod({
name: 'article.insert',
validate: new SimpleSchema({
title: { type: String }
}).validator(),
run( document ) {
Articles.insert( document );
}
});
export const updateArticle = new ValidatedMethod({
name: 'article.update',
validate: new SimpleSchema({
_id: { type: String },
'update.title': { type: String }
}).validator(),
run( { _id, update } ) {
Articles.update( _id, { $set: update } );
}
});
import '../../api/redactor-article/client';
import '../../api/redactor-article/server/publications.js';
import '../../api/redactor-article/methods.js';
import './article.html';
import './article.sass';
import './article.js';
文件结构
/imports
/api
/article
/client
article.html
article.js
article.sass
index.js
/server
publications.js
index.js
methods.js
更新
/imports
/api
/article
/client
article.html
article.js
article.sass
index.js
/server
publications.js
index.js
methods.js
也许这样构造导入模块会更好:
imports/
api/
articles/
publication.js
methods.js
collection.js
ui/
articles/
article.html
article.css
article.js // contains helpers, events and onCreated/onRendered
然后我必须导入startup/client
(>此模块的所有ui文件和所有api文件)和startup/server
(>仅导入所有api文件)中的文件
对吗?有几点:
- 您已将所有内容置于
下。该目录是为集合、方法、帮助程序、“业务逻辑”和公共API而设计的(例如,如果您公开了REST API,您将在该目录中进行)。对模板(包括其样式和相关的imports/api
文件)使用.js
imports/ui
- 您不需要区分导入中的
和客户端
目录。只需从相应的主入口点导入所需的文件(即服务器
和client/main.js
)。这一点比我在这里建议的要复杂一些,请参阅下面流星指南中“结构”的链接server/main.js
似乎不是放置index.js
文章集的合乎逻辑的地方。我会在
为它创建一个文件。请参阅,以获得有关放置位置和原因的良好概述/imports/api/articles/articles.js
- 此外,为了实现以下最佳实践,请为您的
收藏使用默认导出:文章
import
s或其他类型的模糊处理以确保安全。在Meteor上实现安全性的理想方法是假设任何东西都可以在客户机上访问(几乎可以),并相应地编写服务器端代码。这意味着,如果你有一个管理区域,假设任何人都可以访问它。您可以在服务器方法
和出版物
中检查this.userId
并在那里进行数据库查找,以确保用户具有正确的权限。此外,本指南还提供了有关这方面的更多信息:
关于导入/导出的最后一点注意事项:它们背后的思想不是减少代码大小,而是提供实际使用的内容(并省略不使用的文件)的图表,以加快热代码的重新加载,从而获得更好的开发体验。它们还可以使应用程序代码更清晰、更容易理解,因为您没有可能来自任何地方的随机魔法球,并且有助于将逻辑上不同的代码片段分开
祝你好运:)谢谢。对你的答案有几个问题:1。我想我不明白
api
和ui
文件夹之间的区别。如果我将助手放在api
中,将模板放在ui
中,那么编码就比较困难,因为它们属于一个整体,但存储在两个位置。。。??你说“关联的.js文件”进入ui
。。2. '使用默认导出“->我不是在“imports/api/article/index.js”中这样做的吗?我将api/
文件夹划分为客户机/服务器,正如这里所描述的那样:这可能“更难”,但它可以简化在技术发生变化时交换应用程序位的过程。这个想法是,虽然您现在可能正在使用Blaze作为模板,但稍后可能会切换到React或Angular。同样,您可能会决定从MongoDB切换到另一个数据库堆栈。数据应该独立于视图,并且每个数据都应该是可独立测试的。关于你的第二条评论:在一天结束时,你可以随意分割文件夹。为了您自己的利益,我建议将UI代码放在API目录中是没有意义的。出于同样的原因,不建议采用Meteor 1.3结构的/client
/server
/both
并将其转储到/imports/api
目录中。如果有的话,把它放在/imports/client
/imports/server
等中,但是有很好的理由不这样做,正如我在我的回答中链接到的Meteor指南部分所述