Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"exclude" will NOT work SOMETIMES when there are tons of files in project #101

Open
ygweric opened this issue Aug 7, 2023 · 5 comments
Open

Comments

@ygweric
Copy link

ygweric commented Aug 7, 2023

background

my h5 page is in the same project when my web page, I only use pxtorem in my h5 page, exclude all my web page.

the bug

it works well in my localhost, but in the online environment which is build with jenkins, web page is using rem sometimes, not always.

After I rebuild on jenkins, it works well again.

It is hard to create a large project to reproduct this bug.

@ygweric
Copy link
Author

ygweric commented Aug 7, 2023

Here is my way to find bug and how to fix it.

I download the source and copy them to my project, then add some log to debug it .

what I found is, the file path in Declaration(decl) and Once(css) is NOT same sometimes.
there is my code

module.exports = (options = {}) => {
  convertLegacyOptions(options);
  const opts = Object.assign({}, defaults, options);
  const satisfyPropList = createPropListMatcher(opts.propList);
  const exclude = opts.exclude;
  let isExcludeFile = false;
  let pathOnec;
  let pxReplace;
  return {
    postcssPlugin: "postcss-pxtorem",
    Once(css) {
      const filePath = css.source.input.file;
      pathOnec = filePath;
      if (
        exclude &&
        ((type.isFunction(exclude) && exclude(filePath)) ||
          (type.isString(exclude) && filePath.indexOf(exclude) !== -1) ||
          filePath.match(exclude) !== null)
      ) {
        isExcludeFile = true;
      } else {
        isExcludeFile = false;
      }

      const rootValue =
        typeof opts.rootValue === "function"
          ? opts.rootValue(css.source.input)
          : opts.rootValue;
      pxReplace = createPxReplace(
        rootValue,
        opts.unitPrecision,
        opts.minPixelValue
      );
    },
    Declaration(decl) {
      if (isExcludeFile) return;
      console.log(` $$$$$$$ step2: Declaration(decl) ${decl.source.input.file}`);
      console.log(` $$$$$$$ step2.1: pathOnec is ${pathOnec === decl.source.input.file ? 'same': `different: ${pathOnec}`}`);


      if (
        decl.value.indexOf("px") === -1 ||
        !satisfyPropList(decl.prop) ||
        blacklistedSelector(opts.selectorBlackList, decl.parent.selector)
      )
        return;

      const value = decl.value.replace(pxRegex, pxReplace);

      // if rem unit already exists, do not add or replace
      if (declarationExists(decl.parent, decl.prop, value)) return;

      if (opts.replace) {
        decl.value = value;
      } else {
        decl.cloneAfter({ value: value });
      }
    },
    AtRule(atRule) {
      if (isExcludeFile) return;

      if (opts.mediaQuery && atRule.name === "media") {
        if (atRule.params.indexOf("px") === -1) return;
        atRule.params = atRule.params.replace(pxRegex, pxReplace);
      }
    }
  };
};

there is part of my full log


 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is same
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
>>>>>>>>>>>>2 decl.prop:top :70px
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
>>>>>>>>>>>>2 decl.prop:padding :0 24px
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
>>>>>>>>>>>>2 decl.prop:width :1872px
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
>>>>>>>>>>>>2 decl.prop:height :64px
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2: Declaration(decl) C:/Users/glodon/repo/bimface-ops-bid/src/views/analysis/index.vue?vue&type=style&index=0&scoped=true&lang.less
 $$$$$$$ step2.1: pathOnec is different: C:/Users/glodon/repo/bimface-ops-bid/src/webAppView/detailsEnergy.vue?vue&type=style&index=0&scoped=true&lang.less

After reading the documentation of postcss, I know postcss NEVER ensure that Declaration(decl) and Once(css) always in sync

@angryLid
Copy link

angryLid commented Aug 30, 2023

hi, so is there any way to solve this problem ?

@hq229075284
Copy link

Take version fallback to 5.1.1 😑

@ygweric
Copy link
Author

ygweric commented Oct 23, 2023

hi, so is there any way to solve this problem ?
I fix it in my PR #102, which has NOT been merged
you can use my forked npm with npm i postcss-pxtorem-eric

@zhaojjiang
Copy link

hi, so is there any way to solve this problem ?

I fix it in my PR #102, which has NOT been merged
you can use my forked npm with npm i postcss-pxtorem-eric

Here is still a problem in your solution

The problem in 6.0.0 is applying incorrect rootValue to target file

In your solution, some files not in exclude can be skipped too

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants