用于扩展calmjs框架以支持使用webpack从python包提供的javascript源代码生成可部署工件的包,该包与来自npm或其他类似包存储库的标准javascript或node.js包一起使用。

calmjs.webpack的Python项目详细描述


calmjs.webpack

通过 calmjs框架方便使用javascript源代码 与node.js包一起包含在python包中 源于声明的 npm 或类似的包存储库 以及在 允许python包依赖项重用和扩展的方式。

https://travis-ci.org/calmjs/calmjs.webpack.svg?分支机构=1.2.0https://ci.appveyor.com/api/projects/status/327fghy5uhnhplf5/branch/1.2.0吗?svg=truehttps://coveralls.io/repos/github/calmjs/calmjs.webpack/badge.svg?分支机构=1.2.0

简介

Web应用程序可以使用任何语言作为其后端, 但是他们可能提供的交互前端用户界面 最终依赖于某种形式的javascript。尤其是如果 相关功能来源于基于node.js的包 管理系统,如 npm 。但是,后端语言 提供自己的包管理系统通常缺乏全面的 与 npm 集成,或者集成与任何 不能以更通用的方式重用的框架。

解决这个问题的一个常见方法是,一个包可能被迫 一分为二,或者至少是完全独立的部署 使用系统,以便javascript工具管理前端- 端面零件。除此之外,这些独立的系统 必须互相沟通。这会导致如下问题 在构建软件堆栈、部署不稳定和 在项目上下文之外不可复制,限制了可重用性 因为整个过程通常是紧密的 耦合到基础源存储库。最终,这就离开了 后端语言的用户无法传达前端 跨包边界部署信息以供其重用 从属项(例如,对于其他下游包,将包扩展到 以经过充分测试的方式促进可重用性的方法。)

这种自给自足的行为也困扰着webpack node.js 包提供结果工件,但不一定 以可重用的形式生成它们的方法。 当然,这些包的最典型用例可以通过 不过,对于提供 代纳基于mic插件的系统很快就会出现问题,因为 Webpack要求在生成时知道所有导入。这使得 没有独立的扩展很难实现 对可用的模块名和 他们可能在哪里。

calmjs框架的目标是允许python包 公开它们的javascript代码,就好像它们是 npm 托管的一部分 来自客户端代码的模块系统,这个包, calmjs.webpack , 利用此功能不仅提供标准调用 方法用于 webpack 用于python包,还可以用于 下游包生成综合网页包的选项 仅包含其 与其他现有设备一起使用的特定扩展 工件。

功能

如何工作

calmjs框架提供了允许python包 声明它们所需的对基于 npm 的包的依赖关系 它们提供的javascript代码,还允许python包公开 它们可能包含在声明性 方式:

包含在 calmjs.webpack中的实用程序提供了使用 这些声明,将javascript文件作为源文件和 编译目标,生成最终可部署工件 从 webpack 包中通过 webpack

而通过python包提供的输入源文件 可以用Webpack理解的任何格式编写,目前只有 标准ES5处理正确。原因是 calmjs.parse ,用于 javascript的解析,目前只理解es5,并被使用 用于提取所有import语句以创建动态calmjs 为webpack导入系统,并传输commonjs和amd(异步模块定义) 需要语句才能使用此动态导入系统。

生成的源将与 从node.js包获取的所有已声明的绑定源 管理器或存储库,以及(可选)生成的导入模块。 然后将生成一个webpack配置文件,其中包含 选定的相关来源,以便生成最终 工件文件。然后可以将它们部署到适当的 环境,或者上述整个过程可以作为 通过提供的api提供python后端的功能 通过这个包裹。

最终,calmjs.webpack的目标是简化集成和 客户端javascript与服务器端python的交互, 通过简化建造、运输和部署 一个共享包和环境中的一组源。卡尔姆斯 框架提供了这两个环境和 那里提供的工具将有助于建立一个共同的, 可复制的本地node.js环境。

最后,对于质量控制,此包与 calmjs.dev ,它提供了设置测试所需的工具 运行javascript测试的环境和工具 相关javascript代码的python包。然而, 该包没有声明为直接依赖项,因为不是所有的 案件将需要该包的可用性。请参考 有关详细信息,请参见安装部分。

支持的网页包版本

因为webpack是一个项目,多个主要版本 自calmjs.webpack的初始开发和发布以来发布。 目前已知, calmjs.webpack 支持webpack-2版本2.6或 更大,webpack-3和webpack-4。而web包声明为 此版本的 calmjs.webpack ,下游包可以稍后声明 但建议将 calmjs.webpack 测试套件 完整执行以验证给定的 环境中的版本。执行的详细说明 calmjs.webpack的集成测试在测试中 安装部分。

安装

建议本地环境已经有node.js和 npm 安装在最低限度,以便安装 网页包 ,如果尚未安装并可用。也, python的版本必须是2.7或3.3+。pypy和pypy3 支持,建议的版本为pypy3-5.2或更高版本, 虽然pypy3-2.4应该可以工作,但是由于 新版本的依赖关系拒绝旧版本的python。

要在给定的python环境中安装calmjs.webpack 使用以下命令直接从pypi安装:

$ pip install calmjs.webpack

作为这个python包与node.js工具的接口, 系统上也应提供此语言。请安装 一个受支持的LTS版本,如 node.js 网站上所列。 目前,此软件包支持的node.js最低版本为6。

安装/使用带有calmjs的webpack

为python包建立开发/构建环境 当前对 webpack calmjs.webpack 的支持 工作目录,可以执行以下命令:

$ calmjs npm --install calmjs.webpack

运行npm install webpack时(连同其他相关软件包 由 calmjs.webpack 声明,它需要从 npm 获得 同样的效果,请注意,calmjs框架使得 npm 要向下传播到依赖包的依赖项;如果 声明 calmjs.webpack 为依赖项的python包 (通过安装需要或附加要求 setup.py )可能有一整套依赖于 使用以下命令安装(假设包名为 示例.包

$ calmjs npm --install example.package

如果对 calmjs.webpack 的依赖被声明为附加要求 在名为 webpack 的节下,该命令将变为 以下内容:

$ calmjs npm --install example.package[webpack]

如果正确声明依赖项,则使用上述命令将 安装javascript/node.js代码所需的所有依赖项 example.package通过 净现值 。注意,它的依赖项也将获得声明的 依赖关系。

有关所有工作原理的详细信息,请参见 calmjs 的文档。否则,请继续使用 部分:

替代安装方法(高级用户)

目前仍在开发calmjs.webpack 功能和错误修复,开发版本可以通过 吉特喜欢这样:

$ pip install calmjs
$ pip install git+https://github.com/calmjs/calmjs.webpack.git#egg=calmjs.webpack

或者,可以直接克隆git存储库并执行e python setup.py在源代码的根目录中开发 目录。

请记住 calmjs 必须在 设置之前可用。py calmjs.webpack 源代码树中执行,因为它需要 calmjs 中编写功能。或者, 如果有任何关于 在调用 设置.py

由于 calmjs 同时声明为名称空间和包,因此 工作python环境中需要的低级设置 确保内的所有模块都能正确定位。然而, 早于v31.0.0的版本的setuptools不会创建 安装包时所需的包命名空间声明 在与 pip混合时使用这种开发安装方法 在同一命名空间中安装 。因此,不一致的导入 calmjs 命名空间下的任何模块都可能发生故障。作为一个 例子:

>>>importcalmjs.webpackTraceback(mostrecentcalllast):File"<stdin>",line1,in<module>ImportError:Nomodulenamed'calmjs.webpack'>>>importcalmjs.base>>>importcalmjs.webpack>>>

如果这种行为(和解决方法)是不可取的,请确保 安装所有与calmjs相关的包都遵循相同的方法 (即对于所有包,要么 python setup.py develop ,要么使用 通过 pip 获得的轮子,或将 setuptools 升级到版本 31或更高版本并重新安装所有受影响的软件包。

测试安装

最后,为了验证是否成功安装了 calmjs.webpack , 包含的测试可以通过以下命令执行:

$ python -m unittest calmjs.webpack.tests.make_suite

但是,如果将外部node.js依赖项安装到 遵循当前目录,可以指定当前目录 作为环境变量。在POSIX兼容下 shell可以从该目录中执行此操作:

$ CALMJS_TEST_ENV=. python -m unittest calmjs.webpack.tests.make_suite

因为这种特殊的调用形式直接使用 找到当前node.js环境,此环境可用于测试 与用于 当前环境(例如,如果一个特定的包稍后声明为特定的 工件生成过程的Webpack版本。)。

还要注意,如果 calmjs.dev 包不可用,那么 与业力整合相关的测试将被跳过。避免 这可以手动安装calmjs.dev,也可以安装calmjs.webpack。 使用其附加依赖项声明,如so:

$ pip install calmjs.webpack[dev]

用法

从包含javascript代码的包生成webpack工件 通过已经公开的calmjs模块注册表系统 安装到当前环境中,只需执行以下操作 命令:

$ pip install calmjs.webpack
0

本文档中的以下部分将概述如何 为给定的python启用javascript模块导出功能 通过calmjs模块注册表系统打包,但是 有关此主题的详细说明,请参阅提供的自述文件 通过 calmjs 包,在 从 python包

为python包声明javascript导出

嵌入在python包中的javascript代码可以公开给 calmjs框架通过 calmjs.module 注册表。例如, 给定由 名为示例的包

$ pip install calmjs.webpack
1

这是对包有效的最基本的声明那份 与提供的导入位置同名。

下面是具有嵌套子模块的包的AM示例 (称为example.lib 和example.app ):

$ pip install calmjs.webpack
2

而声明的导入位置看起来就像一个python模块 (根据python入口点的规则),calmjs.module registry将使用commonjs/es6风格的导入路径显示它们 (即 'example/lib' 'example/app' )。因此用户希望 要导入这些特定的javascript模块,需要 以这些字符串为前缀的必需模块。

请注意,默认的源提取器将提取所有 这些目录中的javascript文件。最后,由于 如何进行导入,建议不要使用 使用。

如果手头的包没有直接声明它对 calmjs ,一个显式的 calmjs\u模块注册表=['calmjs.module'] 可以 需要在 setup 函数中声明包以确保 这个默认的模块注册表将用于获取javascript 来源于。

综上所述, setup.py 文件应该包含 以下内容:

$ pip install calmjs.webpack
3

对于示例包的webpack工件的构造,它 可以通过 calmjs webpack 构建工具这样做,该工具 将提取所有相关源,创建一个临时构建 目录中,生成生成生成清单并在其上调用webpack 文件。运行示例:

$ pip install calmjs.webpack
4

因为calmjs.webpack使用的构建过程是在一个单独的 构建目录,所有通过node.js模块系统的导入都必须是 声明为 extras\u calmjs ,作为 节点模块的可用性。 不会出现。例如,如果example/app/index.js 需要 jquery和下划线的用法如下:

$ pip install calmjs.webpack
5

它需要声明源于 npm 的目标位置加上 包json 对于依赖项,需要在 its 设置.py

$ pip install calmjs.webpack
6

完成后,重新运行python setup.py egg_info以编写 新声明的元数据进入包的egg info目录,以便 它可以在环境中使用。 calmjs npm --安装 现在可以调用示例 npm 依赖项安装到 当前目录;允许calmjs.webpack找到所需的文件 源于 npm 以放入 webpack 的生成目录 找到它们。

最终的calmjs运行结果可能是这样的:

$ pip install calmjs.webpack
7

作为Webpack工件生成过程的一部分触发测试执行

对于测试,向模块测试注册表声明适当的条目 与给定包的模块注册表一起提供的 使用 calmjs.dev 包提供的 karma 运行时, 测试可以作为webpack工件构建过程的一部分执行。 命令如下:

$ pip install calmjs.webpack
8

请注意,两者提供的 必须安装calmjs.dev 和calmjs.webpack 。这个罐头 通过声明适当的安装要求很容易完成,或者 手动安装calmjs.dev,然后从 npm 使用 calmjs npm -d --安装 calmjs.webpack[dev]

动态模块导入

虽然webpack本身在某种程度上支持这一点,但是 仅通过直接的文件系统级支持实现。在 calmjs的例子,在这里输入是通过usi完成的上的ng标识符 在generated webpack.conf.js中显式定义的别名 默认情况下, 网页包 无法解析这些别名。

而不是让contextreplacementplugin工作或编写 另一个webpack插件,一个代理项import模块是 自动生成并包含在每个生成的工件中 动态导入将按预期运行。基本原理 使用它作为解决方法只是希望避免可能的api 作为这些性质的插件,对webpack的更改最终将是 紧密耦合到网页包

通过使用代理项导入模块,动态导入也 在通过calmjs生成的多个web包中工作 webpack,但这是一个高级主题,因此需要进一步的文档 将是必需的,作为具体的申报/进口订单和各种其他 存在使实际使用复杂化的警告(例如正确处理 循环导入将始终是一个非常重要的问题。

对于简单的情况,想象一下下面的javascript代码:

$ pip install calmjs.webpack
9

如果 example/lib/core.js 源文件是由 example 导出的 包并包含在网页包中,上述动态导入应 默认情况下,功能完全没有问题,无需进一步配置。

如果这个动态导入模块功能是不需要的,并且 任何要包含的javascript代码都使用动态导入,这是 功能可能被 --禁用calmjs compat标志禁用。

网页包加载程序的处理

webpack提供加载程序的支持,以处理 不是javascript源的文件,例如 比如json文件的文本可以无缝地与其导入 系统。python包可以导出这些资源文件 通过辅助加载程序可用于Webpack环境 将公开相关资源的registry calmjs.module.loader 在 calmjs.module 注册表中为给定的 包装:

至于装载机本身与calmjs的集成 工具链系统,必须指定单独的loaderplugin注册表。 对于Webpack工具链,注册表 calmjs.webpack.loaderplugins 被分配为默认值,它将解析通用处理程序 处理目标资源文件。此通用处理程序支持 装载机链条。资源类型的特定处理程序可以是 直接分配给该注册表,例如 需要node.js包才能自动覆盖默认值 生成的处理程序。

如果此自动解析行为是不需要的,则静态注册表是 为此,在 calmjs.webpack.static.loaderplugins 中定义, 但是,要在此时启用此注册表,需要 直接使用工具链API。

至于指定python包中包含的资源文件是 提供给webpack环境,子模块 应该使用loader registry calmjs.module.loader

综上所述,前面定义的 示例包是 现在扩展为公开各种类型的资源文件以供使用:

$ calmjs npm --install calmjs.webpack
0

这将使 example/lib example/app 命名空间位于 相关的加载程序,如果某些javascript代码包含 声明如下:

$ calmjs npm --install calmjs.webpack
1

请注意,这将使这些全名 动态模块导入,因为在 生成的工件。

默认的loaderplugin处理程序注册表将提供 将处理程序定义为none,以便这些处理程序需要具有 EXP将正确解析合法加载程序前缀。然而,webpack有 很大程度上不赞成使用显式加载程序前缀,而是倾向于使用 不带指定前缀导入的语法。这需要一个 不同的处理方法,记录在下一节中。

在不显式加载程序的情况下处理 require() 前缀

如果忽略RequireJS/AMD工具的支持(注意 将影响任何使用此代码的依赖python包 直接,因为它目前还不支持此导入方法)。 可以使用裸导入语法,例如:

$ calmjs npm --install calmjs.webpack
2

跨所有工具链的兼容性的一个原因,特别是 装载机,如果不是不可能的话很难实现是由于 有多种方法可由 不同的node.js工具。例如,从 在webpack中,通常通过链接 样式加载程序来完成 任何特定的样式表加载程序,比如css加载程序 SASS加载器 沿链条向下。虽然可以定义 以下是calmjs.module.loader注册表中的入口点:

$ calmjs npm --install calmjs.webpack
3

根据上述定义,使用 完整语法(即, require('style!CSS!示例/app/style.css'); 可以工作,但它与需要css的加载程序不兼容 它不一定支持链接 样式!装载机 前缀作为插件的RequireJS版本将应用样式 立即没有这个(这就是为什么要考虑加载器前缀 不可携带)。

因此为了更好地支持这个更加不可知的用例,webpack提供了 module.rules 指定特定模块的 加载,以便可以实现loaderprefix自由加载(即 上一个javascript片段)。通过 calmjs,资源入口点应该定义在 calmjs.module.webpackloader 注册表而不是公共 calmjs.module.loader 注册表。例如:

$ calmjs npm --install calmjs.webpack
4

请注意,虽然也可以定义入口点 如下所示:

$ calmjs npm --install calmjs.webpack
5

以前,这依赖于一个遗留行为,该行为已删除webpack,但是 它仍然受到 calmjs calmjs.webpack 的支持,这仅仅是因为 此格式的一般支持,但假定此注册表是 特别是对于webpack,如果webpack没有问题 如果解决了以下注意事项,则使用特定语法。

请注意,如果在多个 webpackloaders(注意,文本加载器已将json作为文件删除 名称扩展名),生成的行为未定义为 配置不能保证装载机是链接在一起的 以预期的方式,因为两个加载程序都将应用于选定的 未定义顺序的文件。

calmjs.module.webpackloader导出的模块名 为动态 由默认加载程序插件处理程序处理时导入模块,如 存在着许多微妙的复杂性,使之严重复杂化 以有意义的方式公开这些名称,以便在calmjs中使用 系统。实际上,在 神器的构造。

如果在此中定义的文件扩展名也在 calmjs.module.loader 注册表,如果 还生成了动态导入模块。这个问题与 上一段概述的问题。

如果需要多台装载机(例如样式表的情况下, 使用链式语法,如 样式加载程序所示!css加载程序定义 以确保它们被正确应用,就像 是不是直接在这个特殊的 python包(即 样式!CSS!

与标准的calmjs.module.loader注册表非常相似, 在下面声明的任何给定文件扩展名的定义 calmjs.module.webpackloader 注册表是包的本地注册表,因此 使用不同于 上游或下游的包装不会对它们造成干扰 已应用。

测试独立的、最终确定的Webpack工件

使用标准的calmjs webpack生成的webpack工件 工具链运行时可以使用 calmjs karma 运行时进行测试 由 calmjs.dev 包提供。给出一个定稿 example.webpack.js 实现 示例 包,工件可以使用提供的测试进行测试 通过使用以下命令的 示例 包:

$ calmjs npm --install calmjs.webpack
6

上面的命令使用 calmjs.webpack 测试示例.webpack.js的设置 工件文件,使用 示例 包提供的测试。这个 测试执行与开发过程中的测试执行类似。

为python包声明预构建的webpack工件

最后,为了完成python包的部署,这个过程 应该包括自动生成和包含javascript 结果python轮中的工件。这可以通过 在 calmjs.artifacts 注册表中使用键指定一个条目 作为工件的文件名和作为导入的值 建筑商的位置。提供的默认生成器函数位于 calmjs.webpack.artifact:complete_webpack 将启用生成 python包的完整webpack工件。建造者 calmjs.webpack.artifact:optimize\u webpack 也会这样做,但是 已启用优化选项(当前只有最小化输出是 支持)。

例如,包含两个表单的配置可能看起来像 所以:

$ calmjs npm --install calmjs.webpack
7

一旦这些入口点被添加到setup.py和包中 元数据使用 setup.py egg_info 重新生成,运行 calmjs 工件构建示例.package 将使用webpack工具链 并在 包元数据目录中的目录 示例.package 。或者,对于与 setuptools ,setup.py中的 setup 函数也应该 启用 build_calmjs_artifacts 标志,以便 setup.py build 也会触发建筑过程。这对 自动生成并包含工件作为轮子的一部分 建造过程。考虑这个 设置。py

$ calmjs npm --install calmjs.webpack
8

使用 setup.py 构建轮子可能会导致这样的结果。 注意,执行 webpack 是过程的一部分,并且 元数据(egg info)目录随后被构建到控制盘中。

$ calmjs npm --install calmjs.webpack
9

为了测试包工件,下面的入口点还应该 在 calmjs.artifacts.tests 注册表下指定,以便 运行calmjs工件业力示例。包将执行 由example.package针对工件声明的javascript测试 在 calmjs.artifacts 中声明的

$ calmjs npm --install example.package
0

请注意,相同的"测试完成"网页包将能够 测试优化网页K工件也。

故障排除

以下是有关此包及其 与其他python/node.js包集成。

critical calmjs.runtime webpackruntimeerror:无法找到"webpack"

这意味着当前node.js环境缺少 webpack 从npm打包;可以手动安装,也可以通过 关于这个包的calmjs 。如果需要使用给定的python包 要生成包,其 包应声明 或者声明依赖于 calmjs.webpack

critical calmjs.runtime网页包退出错误:网页包已终止

这可能是多种原因造成的;它可能是由于无效的 提供的javascript代码中的语法,或者 包含足够的信息,以便 webpack 正确执行,或 特定的 calmjs webpack 标记以某种方式启用 与网页包不兼容。提取有关 错误,同样的 calmjs 命令可以用 为额外日志消息启用的标志 可能会透露有关错误性质的进一步信息,或 完整的回溯可以提供进一步的信息。详细的 必须包含用于在 问题跟踪者

用户警告:未知分发选项:

在使用开发方法设置和安装期间,如果 显示警告消息,请确保egg元数据正确 通过在源代码中运行python setup.py egg_info生成 目录,因为在安装程序 脚本最初是执行的。

警告找不到npm包的"package.json"????-装载机'

当试图使用 未将适当的加载程序模块安装到 工作node.js环境。作为网页包的快速解决方案 工件生成问题,缺少的包安装命令可能是 尝试,但是正确的解决方案是该包声明 正确的加载程序包作为 package\u json中的依赖项

贡献

  • 问题跟踪器:https://github.com/calmjs/calmjs.webpack/issues rel="nofollow">https://github.com/calmjs/calmjs.webpack/issues
  • 源代码:https://github.com/calmjs/calmjs.webpack rel="nofollow">https://github.com/calmjs/calmjs.webpack

法律

calmjs.webpack 包是calmjs项目的一部分。

CALMJS项目版权所有(c)2016奥克兰生物工程 奥克兰大学研究所。 calmjs.webpack 的许可 GPLV2或更高版本的条款。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
apache commons 3.1中的java httpClient代理支持   ubuntu 14.04 Java:找不到类Xmx1g   java如何用当前用户的数据填充recyclerview?   java Alter Hibernate事务超时仅用于一种方法?   如果没有pow()、函数或递归,如何在c/c++中使用幂函数   java将html UI与本机安卓应用程序相结合   创建GridPane子项时发生java错误   java在基类构造函数中调用虚方法   客户端重新连接javasocket   具有建议日期的java Open DatePicker   雅加达ee Java ee请求范围和异步   classnotfoundexception无法执行目标组织。科德豪斯。项目<projectname>上的mojo:execmavenplugin:1.6.0:java(defaultcli):   java字符串内容相同,但equals方法返回false   primefaces调度的java问题   java帮助我理解关于实现接口的这一课   java Jsoup在下载页面文本时将所有url分离   java将字符串转换为整数错误   java如何从mapDB数据库中检索数据,而不必每次都重写它?