Webpack使用glob表达式导入少量文件?

时间:2017-04-20 18:39:57

标签: webpack less webpack-2

我一直在尝试使用webpack的less-loader自动导入更少的文件,但是glob表达式在root.less文件中不起作用。

详细地说,我正在用webpack替换gulp builder,我可以使用这种模式:

@import 'widgets/**/*.less'; 

自动导入较少的gulp文件(请查看此链接glob expressions)。但是,此模式在webpack中无效,less-loader似乎也不支持。

我尝试使用require.context webpack的方法,但我无法调整订单或文件导入。我需要在逻辑序列中需要更少的文件,因为我使用全局变量(mixins,颜色代码等)。因此,此选项也不可用。

import '../components/variables.less'; 
importAll(require.context('../components/', true, /\.less$/)); // Cannot set a sequence. 
// 'Variables' cannot be found even though I added it above 

所以,似乎我必须手动导入每个文件,这真的很痛苦。这就是为什么我想知道有没有办法自动导入文件?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我添加了paths选项并且有效:

...
{
    loader: 'less-loader',
    options: {
        paths: [
            path.resolve(path.join(__dirname, 'app'))
        ],
        plugins: [
            require('less-plugin-glob')
        ]
    }
}

此处有更多详情:https://stackoverflow.com/a/43621947/2393499

工作示例:https://github.com/notagency/webpack2-with-less-plugin-glob

答案 1 :(得分:1)

我无法为glob模式路径找到合适的解决方案,但我决定动态创建少量文件。遇到此问题的任何人都可以考虑这个解决方案:

   // update entry less file
var dir = require('node-dir');

function updateEntryLessFile() {
    dir.readFiles(path.resolve(__dirname, 'path-for-less-files-folder'), {
        match: /.less$/
    },
    (err, context, next) => { next() },
    (err, files) => {
        if (err) throw err;
        var wstream = fs.createWriteStream(
            path.resolve(__dirname, 'path-to-entry/entry.less')
        );
        _.each(files, path => {
            const relativePath = path.split('client/')[1]; // get relative path from full path
            wstream.write(`@import '~${relativePath}';\n`);
        });
        wstream.end();
    });
}

// When less files are added or removed, it updates entry.less file.
var watcher = require('chokidar').watch(path.resolve(__dirname, 'client/'), {
  persistent: true,
  ignoreInitial: true
});

// Something to use when events are received.
var log = console.log.bind(console);
// Add event listeners.
watcher
  .on('add', path => {
      if (new RegExp('.less').test(path)) {
          log(`Less file: ${path} has been added`)
          updateEntryLessFile();
      }
  })
  .on('unlink', path => {
      if (new RegExp('.less').test(path)) {
          log(`Less file: ${path} has been removed`)
          updateEntryLessFile();
      }
  });

updateEntryLessFile();

所以,你可以在你的webpack构建之前或你的webpack配置中运行它。

如果您找到更好的方法,请随时发布!感谢。