我的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模块。
答案 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'
}
};