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

11

我有一个用于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模块。


我在做类似的事情,但并不完全相同。在我的 webpack.config.js 文件中,我创建了几个不同的配置,根据我运行不同的 npm 脚本时设置的 NODE_ENV 环境变量来进行切换。例如,在我的 package.json 文件中,我有一个名为 build-dev 的脚本,运行 "set NODE_ENV=development&& webpack"。希望这能给你一些想法! - Ganonside
3个回答

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

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

并且像这样输出

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

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


1
你也可以使用 [name] 来创建新文件夹。像这样:
output: {
    path: __dirname,
    filename: '[name]/[name].js',
    chunkFilename: '[name].js',
    publicPath: '/assets/'
},

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'
  }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接