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

[Question] Any loader hook provided before compile? #2039

Open
kenken17 opened this issue May 4, 2023 · 2 comments
Open

[Question] Any loader hook provided before compile? #2039

kenken17 opened this issue May 4, 2023 · 2 comments

Comments

@kenken17
Copy link

kenken17 commented May 4, 2023

Hi, I am new to tap into the world of loader (webpack), may i know if the latest vue-loader have any lifecycle hooks (like preTransformNode previously) that I can tap into before the AST tree is being compiled? I need to manipulate some nodes for my usage.

I have quickly browser the source code but cant seems to find any. So I created a loader to run before vue-loader myself to make use of compileTemplte from @vue/compilet-sfc, but I is there any way I can transform it back to string template to pass to vue-loader?

Any guidance would be greatly appreciated. :)

@RaphaelDDL
Copy link

Interestingly, I had the same need last week and I wasn't able to do much, as you said yourself, the const compiler = require('vue/compiler-sfc'); compiler.parse(source,options) doesn't seem to have a toString or something to get it back after you make modifications to the object.

So what I did was the opposite, I intercepted the source before passing it to Vue. So, in your webpack ruleset you might have something like this, right:

      {
        test: /\.vue$/,
        loader: 'vue-loader',
      },

What I did was add another test for vue below it (webpack rule order go from last to first) and change the source before it goes to vue-loader, by running "my loader". Webpack requires loaders to have external files, so to avoid having to make my own, having to config aliases, etc etc, I instead am using simple-functional-loader and in this way, I can drop a function in the webpack config directly.

So an example:

const { createLoader } = require('simple-functional-loader');

module.exports = {
  module: {
    rules: [
      // (...other rules...)
      {
        test: /\.vue$/,
        loader: 'vue-loader',
      },
      {
        test: /\.vue$/,
        use: createLoader(function(source, map) {
            // here, received `source` is the entire .vue file, as a string
            // `this` has a loader context, such as resourcePath, etc
            // do whatever you want to do with the string then remember to return 
            // a string at the end, this will go to vue-loader to be parsed
            return myEditedString
          }),
      },
      // (...other rules...)
}

The caveat is that I don't have access to pretty parsed arrays like sfc's parse gives, split into style, script, template and having attributes list. So I had to work with RegExp directly on the string, which is not the best and very error prone if not tested properly, but is what I could come with as vue-loader has no pre-parse hook.

Let me know if you find anything better than this lol.

@kenken17
Copy link
Author

Hi @RaphaelDDL. Thanks for the reply. I am actually doing the same (as running a custom loader before vue-loader), yet I am still using the compiler-sfc to get the AST because I have the same exact reason as you, which is not to mess with regexp cause it's too much hassle and error-prone. I dont have any better/worse solution but I am now looking at migrating from webpack to vite. Hope can get some easy way out. Finger crossed.

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

2 participants