将非 npm(旧版)javascript 库与 Jspm 一起使用
Using non-npm(legacy) javascript library with Jspm
我正在尝试集成非 npm 的 this library。我已经失败了很多次,因为我总是使用一些现代框架而茁壮成长,这让我无法集成。
我尝试 backbone.js 和 require.js,甚至是 Dart,现在我顽固地尝试使用 gulp、jspm、aurelia 来实现同样的目标。问题是这个库可能不遵循模块概念。我在初始化这个库时遇到了很多问题,做了很多填充。
所以问题是我如何使用此类库。同时使用现代方法构建 javascript 个应用程序。
对于不遵循现代模块模式的旧库,方法通常是填充它们。
如果您正在使用 webpack,您可以通过声明 imports and exports.
填充模块
RequireJS 有类似的 shim config,但需要更多的连接来声明依赖关系。我强烈推荐 webpack 而不是 Grunt/gulp/RequireJS.
但是,查看您链接的 mapy.cz 库,它通过将脚本标记写入页面来动态加载许多其他资产。我可以看到这有多么困难。
我认为你的选择真的是:
如果许可证是友好的开源许可证,请分叉它并以更现代的模块格式公开它,可以通过 npm 轻松导入。查看 UMD style - you can write a declaration that'll export the module in a format usable by most module systems (AMD, CommonJS, etc). The webpack library and externals page 中关于以其他人可以使用的格式编写模块的一些指南。
如果它不是开源许可证,您可以联系作者,要求他们更改库的捆绑和加载方式。它应该很容易销售:一个 npm 模块将允许更多人使用他们的代码,并且更容易使用 - 特别是如果他们开始 versioning 它。你可以主动为他们做,或者只是作为他们可以复制的例子。
他们有一个详细说明条款和条件的页面,以及一个 'contact us' 按钮 - 我将从那里开始:http://napoveda.seznam.cz/cz/mapy/mapy-licencni-podminky/licencni-podminky-mapovych-podkladu/
看了代码后,我成功了(我用的是require.js
,但你可以用任何你喜欢的):
// main.js
////////////////
require(['mapy-loader'], function (Loader) {
// load mapy async and wait for it to finish
Loader.async = true;
Loader.load(null, null, function () {
var stred = SMap.Coords.fromWGS84(14.41, 50.08);
var mapa = new SMap(JAK.gel("mapa"), stred, 10);
mapa.addDefaultLayer(SMap.DEF_BASE).enable();
mapa.addDefaultControls();
});
});
<!doctype html>
<html>
<head>
<script data-main="main.js" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.min.js"></script>
<script>
requirejs.config({
paths: {
"mapy-loader": "//api.mapy.cz/loader"
},
shim: {
'mapy-loader': {exports: 'Loader'}
}
});
</script>
</head>
<body>
<div id="mapa" style="width:600px; height:400px;"></div>
</body>
</html>
(它不会在此处的代码段中 运行,因为 JavaScript 应该放在名为 main.js
的文件中)
编辑:
添加 jspm/System.js 片段:
(main.js
不变)
// main.js
////////////////
define(['mapy-loader'], function (Loader) {
// load it async and wait for it to finish!
Loader.async = true;
Loader.load(null, null, function () {
var stred = SMap.Coords.fromWGS84(14.41, 50.08);
var mapa = new SMap(JAK.gel("mapa"), stred, 10);
mapa.addDefaultLayer(SMap.DEF_BASE).enable();
mapa.addDefaultControls();
});
});
<!doctype html>
<html>
<head>
<script src="jspm_packages/system.js"></script>
<script>
System.config({
baseURL: "/",
defaultJSExtensions: true,
transpiler: "babel",
paths: {
"mapy-loader": "//api.mapy.cz/loader"
},
meta: {
'mapy-loader': {
format: 'global',
exports: 'Loader'
}
}
});
</script>
<script>
System.import('main.js');
</script>
Run
</head>
<body>
<div id="mapa" style="width:600px; height:400px;"></div>
</body>
</html>
我正在尝试集成非 npm 的 this library。我已经失败了很多次,因为我总是使用一些现代框架而茁壮成长,这让我无法集成。
我尝试 backbone.js 和 require.js,甚至是 Dart,现在我顽固地尝试使用 gulp、jspm、aurelia 来实现同样的目标。问题是这个库可能不遵循模块概念。我在初始化这个库时遇到了很多问题,做了很多填充。
所以问题是我如何使用此类库。同时使用现代方法构建 javascript 个应用程序。
对于不遵循现代模块模式的旧库,方法通常是填充它们。
如果您正在使用 webpack,您可以通过声明 imports and exports.
填充模块
RequireJS 有类似的 shim config,但需要更多的连接来声明依赖关系。我强烈推荐 webpack 而不是 Grunt/gulp/RequireJS.
但是,查看您链接的 mapy.cz 库,它通过将脚本标记写入页面来动态加载许多其他资产。我可以看到这有多么困难。
我认为你的选择真的是:
如果许可证是友好的开源许可证,请分叉它并以更现代的模块格式公开它,可以通过 npm 轻松导入。查看 UMD style - you can write a declaration that'll export the module in a format usable by most module systems (AMD, CommonJS, etc). The webpack library and externals page 中关于以其他人可以使用的格式编写模块的一些指南。
如果它不是开源许可证,您可以联系作者,要求他们更改库的捆绑和加载方式。它应该很容易销售:一个 npm 模块将允许更多人使用他们的代码,并且更容易使用 - 特别是如果他们开始 versioning 它。你可以主动为他们做,或者只是作为他们可以复制的例子。
他们有一个详细说明条款和条件的页面,以及一个 'contact us' 按钮 - 我将从那里开始:http://napoveda.seznam.cz/cz/mapy/mapy-licencni-podminky/licencni-podminky-mapovych-podkladu/
看了代码后,我成功了(我用的是require.js
,但你可以用任何你喜欢的):
// main.js
////////////////
require(['mapy-loader'], function (Loader) {
// load mapy async and wait for it to finish
Loader.async = true;
Loader.load(null, null, function () {
var stred = SMap.Coords.fromWGS84(14.41, 50.08);
var mapa = new SMap(JAK.gel("mapa"), stred, 10);
mapa.addDefaultLayer(SMap.DEF_BASE).enable();
mapa.addDefaultControls();
});
});
<!doctype html>
<html>
<head>
<script data-main="main.js" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.min.js"></script>
<script>
requirejs.config({
paths: {
"mapy-loader": "//api.mapy.cz/loader"
},
shim: {
'mapy-loader': {exports: 'Loader'}
}
});
</script>
</head>
<body>
<div id="mapa" style="width:600px; height:400px;"></div>
</body>
</html>
(它不会在此处的代码段中 运行,因为 JavaScript 应该放在名为 main.js
的文件中)
编辑:
添加 jspm/System.js 片段:
(main.js
不变)
// main.js
////////////////
define(['mapy-loader'], function (Loader) {
// load it async and wait for it to finish!
Loader.async = true;
Loader.load(null, null, function () {
var stred = SMap.Coords.fromWGS84(14.41, 50.08);
var mapa = new SMap(JAK.gel("mapa"), stred, 10);
mapa.addDefaultLayer(SMap.DEF_BASE).enable();
mapa.addDefaultControls();
});
});
<!doctype html>
<html>
<head>
<script src="jspm_packages/system.js"></script>
<script>
System.config({
baseURL: "/",
defaultJSExtensions: true,
transpiler: "babel",
paths: {
"mapy-loader": "//api.mapy.cz/loader"
},
meta: {
'mapy-loader': {
format: 'global',
exports: 'Loader'
}
}
});
</script>
<script>
System.import('main.js');
</script>
Run
</head>
<body>
<div id="mapa" style="width:600px; height:400px;"></div>
</body>
</html>