【问题标题】:JavaScript script replaces strings only when a local variable is definedJavaScript 脚本仅在定义局部变量时替换字符串
【发布时间】:2021-02-25 03:57:07
【问题描述】:

脚本是这样工作的:

  1. 读取包含文件名的manifest.json 文件
  2. functions.php文件读入result变量
  3. 循环通过pages 数组。在每次迭代中,创建正则表达式
  4. result 变量中搜索匹配正则表达式的字符串。如果找到匹配项,则将其替换为来自manifest.json 的类似字符串
  5. 结果变量写入functions.php文件

脚本:

      const manifest = fse.readJsonSync("./dist/manifest.json");

      fse.readFile("./functions.php", "utf8", function (err, data) {
        if (err) {
          console.log(err);
        }
        let result;
        for (let [i, page] of pages.entries()) {

          // page = "index";

          const scriptsRegEx = new RegExp(`/dist/scripts.${page}.+?'`, "g");
          const cssRegEx = new RegExp(`/dist/styles.${page}.+?'`, "g");
          result = data
            .replace(scriptsRegEx, `/dist/${manifest[`${page}.js`]}'`)
            .replace(cssRegEx, `/dist/${manifest[`${page}.css`]}'`);
        }
        fse.writeFile("./functions.php", result, "utf8", function (err) {
          if (err) return console.log(err);
        });
        console.log(result);
     });

问题:

如果我按原样运行脚本,functions.php 内的任何字符串都不会被替换。但是,如果我取消注释循环内的 page = "index" 行,则字符串将在 functions.php 内被替换。简而言之,循环不起作用。可能是什么原因?

【问题讨论】:

  • 好吧,for (let [i, page] of pages.entries()) 似乎没有将page 设置为您想要的,因此您的脚本只有在您手动将其设置为"index" 时才会执行某些操作。添加console.log(page) 看看它是否真的是正确的。即使它是您所期望的,那么显然您正在构建的 RegExp 与文件中的任何内容都不匹配。
  • 我已经尝试过控制台日志记录页面变量以及正则表达式。变量带有正确的正则表达式

标签: javascript node.js wordpress for-loop webpack


【解决方案1】:

一个主要问题是在你的循环中,你正在做:

 result = data.replace(...).replace(...)

由于.replace() 不会修改data,这意味着每次通过循环时,您都会从data 的原始版本开始,并且只有最后一次通过循环才会影响最终值result。如果最后一次循环实际上没有找到任何要替换的内容,那么您最终只是将原始内容写回同一个文件,并且没有任何变化。

你可以通过这样做来解决这个问题:

 data = data.replace(...).replace(...)

然后写出data 的最终值。这样每次循环都会修改上一次循环迭代的结果,而不是每次都从原始内容重新开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多