Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent file from generating new build - Webpack

I have an application with nuxt.js / Vue.

I created a Webpack Plugin so that with each file changed, generate an index.js in a certain directory.

The problem is that when index.js is generated, Webpack recognizes this as a new change and build again, so it stays in that infinite loop ...

To detect changes, I'm using webpack hooks

compiler.hooks.beforeCompile.tapAsync('MyPlugin', (params, callback) => {
  // script to generate an index.js in a given directory
});

how can I prevent index.js from triggering a new build?

Updating the question for better understanding

I'm working on an application made with vue.js | nuxt.js and this component structure

├── components
│   ├── quarks
│   │   └── ...
│   ├── bosons
│   │   └── GridLayout.vue
│   │   └── ...
│   ├── atoms
│   │   └── ButtonStyle.vue
│   │   └── InputStyle.vue
│   │   └── ...
│   ├── molecules
│   │   └── ...
│   ├── organisms
│   │   └── ...
│   ├── templates
│   │   └── ...
└─────

I need to do named and grouped imports, like this:

import { ButtonStyle, InputStyle } from '@/components/atoms/'

but for this to work out I would need to have an index.js inside each folder exporting component by component, example

├── components
│   ├── atoms
│   │   └── ButtonStyle.vue
│   │   └── InputStyle.vue
│   │   └── index.js
└─────

and in index.js

export { default as ButtonStyled } from './ButtonStyled.vue'
export { default as InputStyle } from './InputStyle.vue'

But doing this work manually can be a very tiresome task. Every time you create, delete, rename a component, you would have to update the index.js of your respective folder.

so I started to develop a solution

in nuxt.config.js

import NamedExports from './plugins/NamedExports.js'

export default {
  // ... other config here ...
  build: {
    plugins: [
      new NamedExports()
    ],
  }
}

in plugins/NamedExports.js

const pluginName = 'NamedExports'
const { exec } = require('child_process')

class NamedExports {
  apply(compiler) {
    compiler.hooks.beforeCompile.tap(pluginName, (params, callback) => {
      exec('sh plugins/shell.sh', (err, stdout, stderr) => {
        console.log(stdout)
        console.log(stderr)
      })
    })
  }
}

export default NamedExports

plugins/shell.sh

parameters=$(ls components)
for item in ${parameters[*]}
do
    ls components/$item/ | grep -v index.js | sed 's#^\([^.]*\).*$#export { default as \1 } from "./&"#' > components/$item/index.js
done

but whenever the plugin creates an index.js, a new build is triggered

like image 237
Yung Silva Avatar asked Dec 14 '25 14:12

Yung Silva


1 Answers

Have you added the new file/directory to WebPacks exclude list? If not, the watchOptions.ignore property might be just what your looking for: https://webpack.js.org/configuration/watch/

Hope this helps

like image 83
iHazCode Avatar answered Dec 17 '25 05:12

iHazCode