10

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

如何以文件夹结构输出文件?

据我所知,唯一的可能性是输出[name].js. 如果我使名称非常独特,或者我可以使名称具有-文件夹分隔符,这可能会起作用。那将意味着a/b/c.js将翻译为 name a-b-c。我真的不喜欢这个。我希望能够require("a/b/c")

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

如果有一种我在互联网上找不到的好方法,请告诉我。

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

4

3 回答 3

14

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

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.

于 2015-10-13T06:08:44.377 回答
1

您也可以使用 [name] 创建新文件夹。像这样:

output: {
    path: __dirname,
    filename: '[name]/[name].js',
    chunkFilename: '[name].js',
    publicPath: '/assets/'
},
于 2015-05-05T14:09:26.033 回答
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'
  }
};
于 2021-06-24T17:37:49.960 回答