- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在构建一个 JavaScript 库,我希望它能被 Node 和浏览器使用。
我的库由几个模块和几个 [Handlebars] 模板组成,没有任何东西不能在浏览器中运行。而不是将所有模块压缩到一个源文件中,并将模板添加到该源文件中(通过讨厌的字符串连接),我真的很想把东西分开放在它们自己的、单独的源文件中。所以我会
src/
module1.js
module2.js
templates/
one.handlebars
two.handlebars
然后,也许我会通过构建过程将所有内容打包到一个 dist 文件 (dist/mylibrary.js) 中。
什么是常见的解决方案?浏览器化?咕噜声?还有别的吗?
请注意,我想在 AngularJS 应用程序中使用这个库,并且我想保留这个库。
最佳答案
我最近经历了这个过程,花了比我更高兴的时间来寻找一个好的解决方案。这三个要求很重要:
我发现的问题是,“您希望 require('<third party lib>')
调用在每个环境中做什么?”在 npm、bower 和组件之间,我无法在任何一个包管理器中找到我的所有依赖项。一些依赖项在浏览器中支持 CommonJS,而另一些则不支持。一个针对 Node.JS 和浏览器有不同的脚本。另一个以不与 Browserify 一起工作的不寻常的方式检测到 Node.JS。
我想要一个适用于任何情况的单一解决方案。我决定使用的解决方案是:
require('<npm name>')
调用第三方库--require
功能将所有依赖项别名为它们的 npm 预期名称,同时加载一个 shim 来获取依赖项的全局公开版本。这意味着在浏览器上,必须在执行构建的库之前加载所有依赖项。使用这种方法,所有 Node.JS 依赖项都位于 node_modules
中, 版本通过 package.json
管理,我所有的浏览器依赖项都可以存在于 vendor
中文件夹,无论它们来自何处。或者它们都可以从 CDN 提供服务。通过将第三方库排除在浏览器构建之外,重建速度很快,尤其是在使用 watchify 时。 (browserify 的观看模式)。
示例:(使用 watchify 并显示 async 和 lazy.js 的垫片)
watchify --require ./shims/async.js:async --require ./shims/async.js:lazy.js index.js --outfile dist/lib.js
垫片结构:
shims/
index.js
async.js
lazy.js
Shim 脚本:
// shims/index.js
module.exports = function retrieveGlobal(globalKey){
// Uses self so that this can be used in a web worker
var module = self[globalKey];
delete self[globalKey]; // Optional
return module;
}
// shims/async.js
var shim = require('./')
module.exports = shim('async')
// shims/lazy.js
var shim = require('./')
module.exports = shim('Lazy')
其他依赖项只需要另一个 shim 文件和使用新 shim 重新启动 watchify。
至于测试,我有一个简单的文件 require
d 每个 ( Mocha ) 测试套件在 test/
下并使用 watchify 来构建该文件。我将 watchify 目标文件加载到 files
中 karma.conf.js
中的数组在它之前包含依赖项。只要文件即require
每个测试套件都不在 test/
中目录本身,正在运行 mocha
在 Node.JS 中运行测试仍然可以正常工作。
然后你需要做的就是运行:
watchify <"--require" arguments> tests.js -o tests-built.js && karma start && mocha --watch
...现在您是跨平台 TDD JavaScript 大师:)
关于javascript - 如何在保持库模块化的同时在 Node 和浏览器中使用相同的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23529314/
每个人(希望)都在努力实现代码模块化。我想要做的是有 1 个主要的 Sass 文件,它导入我的所有模块,这些模块是局部的,如果需要,这些局部可以调用它们自己的局部组。我想要的是,不是在我的代码库中调用
如何在 xslt 转换中模块化一组重复的输出?例如,我有如下内容(伪代码)。 并
假设我有几个简单的模型驻留在 food.py 中: import peewee as pw db = pw.SqliteDatabase('food.db') class BaseModel(pw.M
我正在开始一个新的 Angular 项目并尝试模块化我的所有代码——我厌倦了拥有大量的 app.js 文件,而且因为我正在为一家公司开发一个平台,所以我的代码整洁且模块化以便于测试、清洁和易于过渡到
所以,有人告诉我,在 nodeJS 中传递 request 和或 response 变量是“不好的做法”。但这意味着你的大部分代码都必须在 server.js 文件中,这使得它变得困惑而且有点难看。
有一个想法:函数(在 FP 中)可以以与 OOP 中的组件类似的方式组成。对于 OOP 中的组件,我们使用接口(interface)。对于函数,我们可以使用委托(delegate)。目标是实现分解、模
有没有办法将 SQL 代码模块化,使其更具可读性和可测试性? 我的 SQL 代码经常变成一长串复杂的嵌套连接、内连接等,难以编写和调试。相比之下,在像 Javascript 或 Java 这样的过程语
我想知道大公司如何倾向于在他们的页面上模块化组件。 Facebook 就是一个很好的例子: There's a team working on Search that has its own CSS,
我正在寻找在 WPF 中构建模块化应用程序模型的解决方案。目前,我使用 Devexpress POCO MVVM 来构建我的 WPF 应用程序,但缺乏模块化的可扩展性,我正在寻找适合我当前设计并允许构
我制作了一个 Gradle 项目,它使用类加载器从子目录资源/文本中加载文本文件。此时它可以工作,但是当我将项目转换为模块化 JavaFX 程序时,相同的类加载器函数会给出 NullPointerEx
假设我有一个通用类模块: export class MyCalc { data = {} ... } 并说我想扩展更多功能: export class MyCalcLoader {
我的模板文件变得越来越大并且过于复杂(大约 200 行(长)代码,9 级缩进),因此它也变得容易出错。我正在寻找一个简单的解决方案,它可以让我轻松访问 $scope 变量和函数。 我的第一个想法是使用
许多人说要将外部 CSS 和 JavaScript 文件的数量保持在最低限度以减少往返时间。例如,Google 建议每个网站最多分别使用两个 CSS 和 JavaScript 文件。 问题是,作为“模
我试图找出为什么我的 Promise 链执行无序,尽管编写了一个非嵌套的 then 链。我的函数已经模块化,以减少链中发生的代码膨胀(我期望有五个 then 方法),并且我不确定这些模块中的某些内容是
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我使用 create-react-app 创建了一个样板 React 应用程序。 现在,在我的 App.js 文件中 import classes from './App.css'; 我做到了
Java 模块系统是否应该阻止模块通过反射访问其他模块,而不声明正确的模块依赖关系? 例如,在编译这个 hello world Java 11 类时,它从另一个模块调用类,正如预期的那样,它不会编译,
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我的应用程序上有许多不同的“控制元素”:下拉菜单、选项卡、菜单等。在同一页面上,有许多相同的控件。当编写 JavaScript 来处理与每个控件关联的不同事件时,我试图使我的代码尽可能干燥。挑战之一是
处理以下场景的模块化方式是什么:应用程序具有所有标题标签(h1、h2、h3 等)的通用样式。特定组件 Widget.jsx 可以使用这些标题中的任何一个,但 h1 标签具有特殊样式。在 CSS 的“旧
我是一名优秀的程序员,十分优秀!