在 Meteor 项目中使用 ES6“导入”和 CSS/HTML 文件:bug 还是功能?

2024-03-24

我目前正在学习 Meteor,我发现了一些令我感兴趣的东西。

我可以使用 import 语句从 JS 文件加载 HTML 和 CSS 资源。

import '../imports/hello/myapp.html';
import '../imports/hello/myapp.css';
import * as myApp from '../imports/hello/myapp.js';

这让我很惊讶,所以我跑去谷歌,但找不到 ES6 规范中记录的这种行为import或者在 Meteor 的文档中。

所以我的问题是:

  • 我可以依靠这种行为来构建我的应用程序吗?
  • 当 Meteor 修复它时(如果它是一个错误),我的应用程序会崩溃吗?

Notes

  • 我正在使用 Meteor v1.3,不确定这是否也适用于以前的版本。
  • 您可以下载该应用程序来查看此行为Github https://github.com/pgpbpadilla/meteor-playground/tree/so-es6-meteor-import-bounty

在完成我的应用程序的构建文件的实现之后 我发现为什么这有效。

HTML

从文件系统读取文件并将其内容添加到全局模板对象中,例如,

== myapp.html ==

<body>
  <h1>Welcome to Meteor!</h1>
  {{> hello}}
</body>

结果如下 JS 代码:

Template.body.addContent((function () {                                                                       
  var view = this;                                                                                          
  return [
     HTML.Raw("<h1>Welcome to Meteor!</h1>\n\n  "),      
     Spacebars.include(view.lookupTemplate("hello"))
  ];
}));                                                                                                        

它被包装在一个函数中,以文件名作为关键:

"myapp.html": function (require, exports, module) {

     Template.body.addContent((function () {                                                                       
          var view = this;                                                                                          
          return [
             HTML.Raw("<h1>Welcome to Meteor!</h1>\n\n  "),   
             Spacebars.include(view.lookupTemplate("hello"))]; 
     })); 

     Meteor.startup(Template.body.renderToDocument);                                                              

     Template.__checkName("hello");                                                                               
     Template["hello"] = new Template("Template.hello", (
         function () {                                            
           var view = this;                                                                                         
           return [
               HTML.Raw("<button>Click Me</button>\n  "), 
               HTML.P("You've pressed the button ", 
                      Blaze.View("lookup:counter", 
                      function () {
                        return Spacebars.mustache(view.lookup("counter"));                                                   
                      }), " times.")
          ];                                                                                         
     }));                                                                                                         

},

所以我们所有的 HTML 现在都是纯 JS 代码,将通过使用包含require像任何其他模块一样。

CSS

这些文件也是从文件系统读取的,它们的内容也嵌入在 JS 函数中,例如

== myapp.css ==

/* CSS declarations go here */

body {
    background-color: lightblue;
}

转变为:

"myapp.css": ["meteor/modules", function (require, exports, module) {
    module.exports = require("meteor/modules").addStyles("/* CSS declarations go here */\n\nbody {\n    background-color: lightblue;\n}\n");

}]

所以我们所有的 CSS 现在也是一个 JS 模块,稍后使用require.

结论

所有文件都以一种或另一种方式转换为 JS 模块,这些模块遵循类似的规则包含为 AMD/CommonJS 模块。 如果另一个模块引用它们,它们将被包含/捆绑。而且由于全部都转化为JS代码 欺骗性语法背后并没有什么魔力:

import '../imports/hello/myapp.html';
import '../imports/hello/myapp.css';

它们都被转译为它们的等价形式require一旦资产已转换为 JS 模块。

而将静态资产放置在imports官方文档中没有提到目录, 这种导入静态资源的方式是有效的。

这似乎是 Meteor 工作原理的核心,所以我敢打赌这个功能将会存在很长一段时间。

我不知道是否可以将其称为功能,也许更合适的描述是意想不到的结果,但这会 仅从用户的角度来看才是正确的,我假设编写代码的人理解这种情况会发生,甚至可能 故意这样设计的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Meteor 项目中使用 ES6“导入”和 CSS/HTML 文件:bug 还是功能? 的相关文章

  • 使用反增量更改 z-index

    我尝试制作一个图像滑块 当鼠标悬停在一个点上时 它将显示图片 我也尝试使用在图像之间切换z index但什么也没动 slider counter reset index 1000 slider input name slide switch
  • 身体动画不流畅

    下面代码中的 spaceShip 在开始按住任何箭头键时移动并不顺利 它移动一步 冻结一瞬间 然后 平稳 地移动 怎样才能让它从一开始就顺利运转 而不是 冻结 My code
  • 如何为 HTML 元素创建鼠标拖动滑块?

    我发现的许多滑块插件要么仅单击以查看下一个图像 要么如果它们确实具有鼠标拖动或触摸拖动功能 则仅允许图像 有谁知道为任何 html 元素编写鼠标拖动滑块的插件或可能的方法 我专门使用 SVG 但将来如果能在 div 元素之间滑动就更好了 H
  • 更改元素的顺序

    我正在创建一个浮动宽度的网站 用户在智能手机上使用从全高清分辨率到约 600 像素的屏幕 这似乎是一个不错的主意 这就带来了一个非常有趣的问题 当用户使用比最佳分辨率更小的分辨率时 页面的高度会增加很多 这意味着更改某些元素 例如某些图像
  • 来自 HTML5 的 Phonegap Bonjour/Zeroconf 或 Websocket IP 发现

    我正在尝试实现一个 Phonegap HTML5 应用程序 该应用程序连接到 Websocket 服务器 在嵌入式设备中运行 也有 Bonjour 服务 以在家庭网络内交换数据 我想知道使用 Phonegap 检测服务器 IP 的最佳方法
  • 如何在不使用变换或顶部/左侧的情况下转换列表中项目的位置

    有一天我偶然发现一个例子 https codepen io itslit pen gvKrMY它使用 Vue js 但我的问题更多是关于 Vue 用于实现状态之间转换的 CSS 和 HTML 卡片暂时获得等级 shuffleMedium m
  • 如何消除 HTML 内容周围的边距?

    以下 HTML 显示正常 div style width 100px height 100px background red div Hello div div
  • Masonry - imagesLoaded - 不是函数

    Masonry and imagesLoaded应加载并正常工作 已经制作了一个类似的网站 并且可以正常运行 我不知道我的问题出在哪里 所以我希望你能看到问题所在 应该是少了点什么 在 Chrome Inspect 中 我收到以下错误 Un
  • html 选择列表 - 通过传入变量获取文本值?

    我有一个显示列表语言的选择列表
  • 获取 FileReader() 的结果对象

    有什么方法可以在不通过函数的情况下获取 FileReader 的结果对象 我在下面制作了示例代码 HTML br br br div div JS var code lorem ipsum input type file change fu
  • 如何使用 JavaScript 创建链接?

    我有一个标题字符串和一个链接字符串 我不知道如何将两者放在一起以使用 JavaScript 在页面上创建链接 任何帮助表示赞赏 我试图解决这个问题的原因是因为我有一个 RSS 源并且有一个标题和 URL 列表 我想将标题链接到 URL 以使
  • Eslint errorring 导入没有扩展名的 jsx

    我正在尝试在 es6 中导入 jsx 文件而不需要 jsx 扩展名 import LoginErrorDialog from LoginErrorDialogView Not import LoginErrorDialog from Log
  • 将图像作为框架放置在 iframe 周围?

    我有一个网站尝试以移动格式显示 但在宽屏幕上 我确信 iframe 是正确的选择 我正在尝试将 iframe 加载到 iPhone 的图像中 你可以看一个例子here http webfro gs south tour iframe tes
  • 最大宽度调整以适应文本?

    不是最好的标题 但无论如何 我有一个元素max width和一些文字 如果文本长度超过一行所能容纳的长度 我会得到以下结果 My text here hello everyone 换句话说 它占据了完整的最大宽度 但由于单词向下移动 右侧有
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • Firefox 不会在使用 jQuery AJAX 加载的内容上呈现 CSS 样式

    我有一个网站 允许用户对书籍和文章发表评论 主表单有一个搜索输入 用于查找相关书籍或文章 来源 我使用 jQuery 根据输入的搜索词从外部站点动态加载新源 然后还使用 AJAX 返回列表中的源 我有两个问题 现在 在用户输入四个字符后 j
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • 如何创建适合屏幕宽度的等宽/高框? [复制]

    这个问题在这里已经有答案了 我正在尝试建立一个网站 其中有很多宽度和高度相等的框 例如 我有一个页面 其中并排有两个相同大小的框 简单的解决方案是将宽度和高度设置为 50vw 这在出现滚动条之前效果很好 我已经用谷歌搜索了几个小时 但无法理
  • 使用css bootstrap时如何仅向一列添加右边框?

    我正在尝试使用CSS引导框架 http getbootstrap com css tables在我的项目中 我正在使用带有以下类的表table table bordered table striped 我想删除除第一列之外的所有列的边框 这
  • 在 Nexus 7 2013 上更改方向时 CSS 媒体查询不起作用

    我目前正在我的笔记本电脑 台式电脑和 Nexus 7 2013 上测试 CSS 媒体查询 除了 Nexus 7 之外 它们在台式机和笔记本电脑上都运行良好 当我更改方向时 除非刷新页面 否则样式不会应用 例如 以纵向模式握住设备时 页面正常

随机推荐

  • 如何防止 IPAINTING 堵塞并改善着色

    我想从中删除所有使用 IPAINTING 的文本IMAGE https i stack imgur com vxOdS jpg 我一直在尝试各种方法 最终发现可以通过OCR获得结果 然后使用阈值MASK THE IMAGE processe
  • CLR 4.0 中单个对象的大小仍然限制为 2 GB?

    据我了解 NET 中的单个实例有 2 GB 的限制 由于到目前为止我主要在 32 位操作系统上工作 所以我并没有对此给予太多关注 32 但无论如何这或多或少是一个人为的限制 然而 我很惊讶地得知此限制也适用于 64 位 NET http m
  • 在 C 中分割数组

    假设我有一个数组 我想从某些索引范围中删除元素 如果我提前知道数组的大小 数组中每个元素的大小以及要删除的索引范围 是否有任何方法可以避免复制新数组 如果您不想使用新数组进行复制 您可以考虑在同一个数组本身中执行此操作 这就是我所拥有的 i
  • 我的 UIImageView 的任务

    我需要用我的UI图像视图 突出显示UI图像视图点击后 在右侧创建一个清除按钮UI图像视图 清除UI图像视图单击创建的清除按钮 将图像命名为myimage png in UI图像视图之前已清除 任何人都可以帮我做到这一点吗 有任何示例代码 应
  • 使用 Yup 验证字符串或数字长度

    是否有验证特定长度的 yup 函数 I tried min 5 and max 5 但我想要确保该数字恰好是 5 个字符 即邮政编码 此检查会带来最佳的验证体验 Yup string required matches 0 9 Must be
  • 从当前日期获取 GMT 字符串

    我能够获得我需要的输出格式 但不是正确的时间 我需要 GMT 4 小时 的时间 var dt new Date var dt2 dt toString yyyyMMddhhmmss 有任何想法吗 输出看起来像 20120403031408
  • 停止在 hashchange 上触发 popstate

    我正在使用 History API 并使用推送和弹出状态 我想阻止 popstate 事件在某些情况下触发 其中我只将哈希值附加到 URL 例如 在某些情况下 单击锚点会附加 到 URL 并立即触发 popstate 我想避免所有场景 or
  • 使用 python3 进行字符串格式打印:有时从解压数组打印

    In my 几分钟前提问 https stackoverflow com q 56092475 2327328 我问的是如何使用python的打印str format当字符串存储在数组中时进行打印 然后答案显然是解压列表 如下所示 note
  • sqlite3_prepare_v2 正在获取 SQLITE_ERROR

    我已经花了好几个小时了 必须让它工作 它阻碍了 iPhone 应用程序的发布 我第一次使用 SQLite 我已遵循所有建议 但我的 sqlite3 prepare v2 调用每次都会收到 SQLITE ERROR 1 这是我的控制器的代码
  • Paper_Trail:显示版本之间的差异

    我是 Rails 新手 使用 RubyMine 作为 IDE 我有 Paper Trail 保存数据 xoi qb 的早期版本 我的视图当前显示了我想要的当前和以前的数据 但我想显示当前版本 xoi qb 和以前版本 xoi qb 之间的差
  • TINYMCE 设定焦点...只是行不通

    我试过了 tinyMCE execInstanceCommand content mceFocus 我试过了 tinyMCE execCommand mceFocus false content 它们似乎都不起作用 好吧 我陷入了同样的问题
  • 在 Swagger Open API 3.0 中使用另一个参数时如何指示有条件地需要一个参数

    我已经创建了一个 RESTful API 现在正在为该 API 的使用定义 Open API 3 0 JSON 表示形式 当存在另一个参数时 我需要有条件地使用一个参数 所以我也不能真正使用required true or required
  • 无需单击列标题即可对 JTable 的条目进行排序

    我已经使用 DefaultRowSorter 和我自定义的行排序器类在 JTable 上实现了行排序 单击列标题对表格进行排序一切正常 但是 如果我想从应用程序代码内部调用排序操作 而不单击列标题 怎么办 我必须调用哪个方法 EDIT 我这
  • Maven 说它在“反应堆”中找不到东西

    我有一个 Maven 项目 我正在使用它 projects从项目根目录运行多个 pom 文件的命令 mvn clean install projects proj1 then proj2 The proj1 and then proj2是工
  • android google 地图在几层中传播事件

    我正在为 android 1 6 开发一个基于谷歌地图的应用程序 我的问题是 在我的应用程序中 我有不止一层从 ItemizedOverlay 扩展而来 表示地图中的信息 问题是所有层都实现了 onTap 方法 但现在只有最后一层 堆栈顶部
  • 在 UIDocumentBrowserVC 中自动选择 UIDocument

    我正在使用一个uidocumentbrowservc并想选择一个UIDocument以编程方式 就我而言 这是因为我想自动加载上次使用的UIDocument在启动时节省用户一些时间 因为我的应用程序很少更改文档 我天真的方法是存储上次使用的
  • 服务控制器无法启动服务 - 访问被拒绝

    我在 win 表单应用程序中使用服务控制器来启动和停止侦听消息队列并处理消息的服务 当从 win forms 应用程序启动服务时 我收到访问被拒绝错误 我使用的是 Vista Home Basic 和一个管理员类型的帐户 并且我使用了 登录
  • 使用 Moment.js 将 Unix 纪元时间转换为人类可读时间

    我正在尝试使用 Moment js 将 Unix 纪元时间转换为日期和时间 我还想知道如何将其格式化为如下所示 Tuesday November 22 2016 6 00 PM 您可以使用 unix 时间戳初始化一个 moment 对象 然
  • 在 python 中绘制 sklearn 集群

    我使用亲和力传播获得了以下 sklearn 集群 import sklearn cluster import numpy as np sims np array 0 17 10 32 32 18 0 6 20 15 10 8 0 20 21
  • 在 Meteor 项目中使用 ES6“导入”和 CSS/HTML 文件:bug 还是功能?

    我目前正在学习 Meteor 我发现了一些令我感兴趣的东西 我可以使用 import 语句从 JS 文件加载 HTML 和 CSS 资源 import imports hello myapp html import imports hell