【问题标题】:Bundle npm module 'cheerio' in K6 test在 K6 测试中捆绑 npm 模块“cheerio”
【发布时间】:2023-04-01 13:14:01
【问题描述】:

我正在尝试使用来自 LoadImpact 的 K6 框架创建一些测试,但我正在努力按照其文档站点上的说明包含外部 NPM 模块。

在 loadImpacts 文档站点上,它们包含一个关于我所追求的详细示例,这些模块使我能够从肥皂服务响应中解析 xml。但是,我无法让这个工作!现在,我是一个完全的 javascript 新手,但我已经编码多年并且真的很想解决这个问题。 可以在这里找到:https://docs.k6.io/docs/modules#section-npm-modules 谁能得到这个工作?我需要在与 Internet 隔离的服务器上运行它,所以我完全依赖于创建包和传输所需的文件。

根据文档,一个包是这样创建的

-- bundle `cheerio` npm module
git clone git@github.com:cheeriojs/cheerio.git
npm install browserify index.js -s cheerio > cheerio.js

我的第一个问题:在运行此命令时,我所在的文件夹中会创建一个“cheerio.js”文件以及一个“cheerio”文件夹和一个“node_modules”文件夹。 我的“根”目录中的cheerio.js 仅包含以下内容:

+ cheerio@0.22.0
+ index.js@0.0.3
+ browserify@16.2.3
updated 3 packages and audited 2829 packages in 2.221s
found 0 vulnerabilities

返回 LoadImpacts 示例,了解如何在 k6 javascript 中引用此包:

import cheerio from "./vendor/cheerio.js";
export default function() 
{
  const res = http.get("https://loadimpact.com/");
  const $ = cheerio.load(res.body);

这是什么文件,在 browserify 生成的结构中我可以在哪里找到它?我试图将其更改为指向“cheerio”文件夹中的“index.js”或“cheerio/lib”中的cheerio.js。然后,我将收到有关 Cheerio.js 中第一行的投诉,该行定义了一个无法找到的“解析”变量: var parse = require("./parse'), 如果我将其更改为 var parse = require("./parse.js') 它继续抱怨缺少“htmlparser2”,我也可以在这个结构中找到它,但似乎整个依赖结构都不起作用。

谁能给我一些指导,告诉我如何为cheerio 创建一个带有依赖项的browserify 包,以及我需要如何/将什么复制到我的k6 项目以使其像在loadImpact 网站上一样工作。

【问题讨论】:

    标签: npm k6


    【解决方案1】:

    这方面的 k6 文档肯定需要一些澄清,我稍后会做。目前提到的vendor 文件夹并没有什么特别之处,文档只是缺少将browserify 生成的cheerio.jsxml2js.js 文件复制到k6 项目中新的vendor 文件夹的步骤。

    现在,我将尝试就如何以更简单的方式实现同​​样的事情提供一个简化的解释:

    1. 创建一个新的空文件夹并在终端中转到它
    2. 在那里运行npm install browserify cheerio(忽略关于缺少package.json 或描述的npm 警告)
    3. 在该文件夹中运行./node_modules/.bin/browserify ./node_modules/cheerio/ -s cheerio > cheerio.js
    4. 文件夹根目录中生成的 cheerio.js 文件应该是您从 k6 脚本导入的文件:
    import http from "k6/http";
    import cheerio from "./cheerio.js";
    
    export default function () {
        const res = http.get("https://loadimpact.com/");
    
        const $ = cheerio.load(res.body);
    
        console.log($('head title').text())
    }
    

    对于单个 npm 库应该就是这样。

    如果您需要使用多个 npm 包,最好花一些时间将它们捆绑在单个浏览器化的 .js 文件中。例如,如果您需要 k6 文档中提到的 cheerioxml2js 库,则可以执行以下操作:

    1. 新建一个空文件夹
    2. 在其中添加类似于以下package.json 文件的内容:

      {
        "name": "k6-npm-libs-demo",
        "version": "0.0.1",
        "description": "just a simple demo of how to use multiple npm libs in k6",
        "main": "npm-main.js",
        "dependencies": {},
        "devDependencies": {
          "browserify": "*",
          "cheerio": "*",
          "xml2js": "*"
        },
        "scripts": {
          "install": "./node_modules/.bin/browserify npm-main.js -s npmlibs  > vendored-libs.js"
        },
        "author": "",
        "license": "ISC"
      }
      
      

      当然,如果您需要与cheerioxml2js 不同的库,则需要调整devDependencies 选项。

    3. 像这样添加一个npm-main.js 文件(同样,调整你想要的库):

      exports.xml2js = require('xml2js');
      exports.cheerio = require('cheerio');
      
    4. 在终端中打开该文件夹并运行npm install。这应该会导致在文件夹的根目录中创建一个 vendored-libs.js 文件,您可以像这样在 k6 中使用它:

      import http from "k6/http";
      import { cheerio, xml2js } from "./vendored-libs.js";
      
      export default function () {
          const res = http.get("https://loadimpact.com/");
      
          const $ = cheerio.load(res.body);
          console.log($('head title').text())
      
          var xmlString = '<?xml version="1.0" ?>' +
              '<items xmlns="http://foo.com">' +
              ' <item>Foo</item>' +
              ' <item color="green">Bar</item>' +
              '</items>'
      
          xml2js.parseString(xmlString, function (err, result) {
              console.log(JSON.stringify(result));
          });
      }
      

    【讨论】:

    • 对于 Node 模块,您也可以使用 npx browserify -r cheerio -s cheerio &gt; cheerio.js。这将使用 Node 模块加载器来获取模块的入口点,而无需猜测文件路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2017-06-28
    • 2019-06-12
    • 2013-11-15
    • 2021-01-17
    • 2021-11-29
    • 2022-01-03
    相关资源
    最近更新 更多