如何通过合成 const 和 let 变量来减少 javascript 代码?

问题描述 投票:0回答:1

我尝试尽可能减少 JavaScript 以使其加载速度更快。我的最后一步是合成相互跟随的

const
let
。 (所有注释、空格、换行符等均已使用正则表达式删除)。

const
的示例(
let
将是相同的):

 const abc='mystring';const def=[1,2,3];def.forEach(function(){doThis(i)};const ghi='123';function doThis(){...}
 |     const#1       |      const#2    |        something else           |    const#3    |    ...    

我为找到的每个

const
创建一个数组

let rgx = /const\s+([\w]+)\s*=\s*(.*?)(?=\;)/g;  // from 'const' to ';'
let arr = mycode.match(rgx);  // mycode = value of the textarea containing the code 

[0] const abc='mystring'
[1] const def=[1,2,3]
[2] const ghi='123'

一旦找到所有

const
,我就会寻找它们的位置和长度

for (let i=0; i<arr.length; i++){
  let pos = mycode.indexOf(arr[i]+';');  // add the ';'
  console.log(pos+' + '+(arr[i].length+1)+' = '+(pos+(arr[i].length)+1))
}

0 + 21 = 21   // const abc='mystring'; = length 21
21 + 18 = 49  // const def=[1,2,3]; = length 18
68 + 13 = 81  // const ghi='123'; = length 13

21 作为 pos+length(第 1 行)的结果,21 作为 pos(第 2 行)意味着

arr[1]
跟随
arr[0]
并且 49 -> 68 表示此
const
不应受到影响,因为它后面没有其他
const

我想要实现的是

 const abc='mystring',def=[1,2,3];def.forEach(function(){doThis(i)};const ghi='123';
 |          const #1,#2          |            ...                  |   const#3     |

replace(";"+arr[1].susbstr(0,6),",")
...

我尝试使用 [pos]+[lengths] 的数组

vals
,如果
vals[i][0]==vals[i-1][1]
那么两个 const 相互跟随,但这有点麻烦,最重要的是,如果我有 3 个,我该如何管理这个或者 4 个常量一个在另一个后面?有没有一种方法可以实现这个结果,例如,知道可能有 3 个 const,然后是一个函数,然后 2 个 let,然后 3 个 cons,然后...?

javascript minify
1个回答
0
投票

要实现

const
let
声明的合并,您可以按照以下步骤操作:

  1. 找到代码中所有
    const
    let
    声明,并将它们存储在单独的数组中。
  2. 确定每个声明的位置和长度。
  3. 检查连续的声明是否相互遵循。
  4. 如果发现连续的声明,请通过替换 ; 将它们合并到一行中。与 ,.

我分享了一个演示这些步骤的代码片段:

// Sample JavaScript code
let code = "const abc='mystring';const def=[1,2,3];def.forEach(function(){doThis(i)});const ghi='123';let x = 10;let y = 20;const z = 'hello';";

// Step 1: Find all const and let declarations
let constRegex = /const\s+([\w]+)\s*=\s*(.*?)(?=;)/g;
let letRegex = /let\s+([\w]+)\s*=\s*(.*?)(?=;)/g;

let constDeclarations = code.match(constRegex) || [];
let letDeclarations = code.match(letRegex) || [];

// Step 2: Determine positions and lengths of declarations
let getDeclarationPositions = (declarations) => {
    return declarations.map(declaration => {
        let pos = code.indexOf(declaration);
        return [pos, declaration.length];
    });
};

let constPositions = getDeclarationPositions(constDeclarations);
let letPositions = getDeclarationPositions(letDeclarations);

// Step 3: Check if consecutive declarations follow each other
let consolidateDeclarations = (positions) => {
    let consolidated = [];
    let start = 0;

    for (let i = 1; i < positions.length; i++) {
        if (positions[i][0] === positions[i - 1][0] + positions[i - 1][1] + 1) {
            continue;
        } else {
            consolidated.push(positions.slice(start, i));
            start = i;
        }
    }

    consolidated.push(positions.slice(start));

    return consolidated;
};

let consolidatedConst = consolidateDeclarations(constPositions);
let consolidatedLet = consolidateDeclarations(letPositions);

// Step 4: Consolidate consecutive declarations into single lines
let consolidateIntoSingleLine = (declarations, type) => {
    return declarations.map(declarationGroup => {
        let start = declarationGroup[0][0];
        let end = declarationGroup[declarationGroup.length - 1][0] + declarationGroup[declarationGroup.length - 1][1];
        let consolidatedDeclaration = code.substring(start, end);

        return consolidatedDeclaration.replace(/;/g, ',');
    }).join(';');
};

let consolidatedConstLine = consolidateIntoSingleLine(consolidatedConst, 'const');
let consolidatedLetLine = consolidateIntoSingleLine(consolidatedLet, 'let');

console.log('Consolidated Const:', consolidatedConstLine);
console.log('Consolidated Let:', consolidatedLetLine);

此代码将把连续的 const 和 let 声明合并到以逗号分隔的单行中。您可以根据您的具体要求或边缘情况进一步完善它。

© www.soinside.com 2019 - 2024. All rights reserved.