如何使用webpack输出多个文件夹?

时间:2015-01-10 17:40:37

标签: javascript gruntjs webpack

我的JS模块有一个文件夹结构。我想要每页一个模块。这不是单页应用。

如何输出文件夹结构中的文件?

从我所看到的,唯一的可能性是输出[name].js。如果我将名称设置为非常独特,或者我可以使名称为文件夹分隔符-,则可以使用此功能。这意味着a/b/c.js会转换为名称a-b-c。我真的不喜欢这个。我希望能够require("a/b/c")

据我所知,我不能使用单个捆绑文件,因为require在模块外部不可用。如果是的话,我可以在每个页面上构建一个包和require("a/b/c")

如果我有一个很好的方法可以在网上找到,请告诉我。

看起来我可以使用r.js轻松地使用require.js,但我不想使用require.js并且想要CommonJS模块。

3 个答案:

答案 0 :(得分:11)

您可以使用斜杠定义入口点,如下所示:

entry: {
    "main-plugin/js/background":"./src/main-plugin/background"
}

output就像这样:

output: {
    path: path.join(__dirname, 'public'),
    filename: '[name].js'
},

此设置会创建一个public/main-plugin/js文件夹,并将background.js放入其中。它至少在Win7x64上起作用。

答案 1 :(得分:1)

您也可以使用[名称]制作新文件夹。像这样:

output: {
    path: __dirname,
    filename: '[name]/[name].js',
    chunkFilename: '[name].js',
    publicPath: '/assets/'
},

答案 2 :(得分:0)

与节点稍有争论,您可以创建一个 entry 对象来传递配置。就我而言,我使用第二级文件夹的名称来创建不同的包,但您可以轻松适应您的需求。

const path = require('path');
var glob = require('glob')

const exportPath = path.resolve(__dirname,`./../public/javascripts/plugins`);

// create a glob of files
const entryArray = glob.sync('./plugins/**/{svg,src}/**/*.*');

/**
 * Create a dictionary of entries in format: folder: ['file', 'file2']
 * https://webpack.js.org/configuration/entry-context/#entry
 */

var folders = []
var entries = {};

// list unique folders
entryArray.map((item) => {
  const folderName = item.split('/')[2];
  if (!folders.includes(folderName)) {
    folders.push(folderName);
  }
});

// assign files to each folder
folders.map((folder) => {
  var imports = [];
  entryArray.map((item) => {
    const folderName = item.split('/')[2];
    
    if (folder == folderName) {
      imports.push(item);
    }

  });

  entries[folder] = imports
});

module.exports = {
    entry: entries,
    module: {
      rules: [
        {
          test: /\.js$/,
          exclude: /node_modules/,
          use: [
            {
              loader: 'babel-loader',
              query: {
                presets: [ '@babel/preset-env' ],
              },
            }
          ],
        },
        {
          test: /\.css$/,
          use: [
            'style-loader',
            'css-loader',
            {
              loader: 'postcss-loader',
              options: {
                plugins: [
                  require('postcss-nested-ancestors'),
                  require('postcss-nested')
                ]
              }
            }
          ]
        },
        {
          test: /\.svg$/,
          loader: 'svg-inline-loader?removeSVGTagAttrs=false'
        }
    ],
  },
  output: {
    path: exportPath,
    filename: '[name]/dist/bundle.js',
    libraryTarget: 'umd',
    libraryExport: 'default'
  }
};