我正在使用nwidart的laravel模块为laravel应用程序创建单独的模块,每个模块都包含该模块的代码。目前,我正在尝试将与每个模块相关的css文件放入单独的app.scss中,然后使用webpack将.scss移至公共目录中。
我已经设法通过为每个将CSS移至主公共目录的模块包含单独的webpack.mix文件来实现此目的。但是,我的问题是要实现这一点,每次我要更新CSS时,都必须在每个模块文件夹的根目录中运行命令npm run dev
。有没有一种更简单的方法可以在应用程序中运行所有模块webpack.mix.js文件,还是我每次都必须手动进行操作?
这是我正在使用的模块包https://github.com/nWidart/laravel-modules
这也是目录外观的一个示例
-app
----模块
------博客-> webpack.mix.js
--------资源
-----------资产
------------- Sass-> app.scss
这也是博客模块的webpack.mix.js的副本
const { mix } = require('laravel-mix');
require('laravel-mix-merge-manifest');
mix.setPublicPath('../../public').mergeManifest();
mix.sass( __dirname + '/Resources/assets/sass/app.scss', 'css/blog.css');
if (mix.inProduction()) {
mix.version();
}
答案 0 :(得分:2)
我在nwidart模块中遇到了这个问题。要在主weppack.mix.js中解决此问题,请编写以下代码:
const mix = require('laravel-mix');
const fs = require('fs');
const path = require('path');
/*
|--------------------------------------------------------------------------
| Mix Asset Management
|--------------------------------------------------------------------------
|
| Mix provides a clean, fluent API for defining some Webpack build steps
| for your Laravel application. By default, we are compiling the Sass
| file for the application as well as bundling up all the JS files.
|
*/
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css');
const moduleFolder = './Modules';
const dirs = p => fs.readdirSync(p).filter(f => fs.statSync(path.resolve(p,f)).isDirectory())
let modules = dirs(moduleFolder);
cssArray = [];
cssArray.push('public/css/app.css');
modules.forEach(function(m){
let js = path.resolve(moduleFolder,m,'Resources','assets','js', 'app.js');
mix.js(js,'public/js');
let scss = path.resolve(moduleFolder,m,'Resources','assets','sass', 'app.scss');
mix.sass(scss,'public/css/'+m+'.css');
cssArray.push('public/css/'+m+'.css');
});
mix.styles(cssArray, 'public/css/all.css');
答案 1 :(得分:0)
我一直在搜索此文件,但不能相信2020年尚无记录的解决方案。因此,这是我的解决方案,但我认为这不是正确的解决方案,但有帮助,并且比以前的解决方案容易得多。
使用以下命令创建模块后
:工匠模块:制作Bla
例如,您有(postgres_fdw
是您的模块的名称):
Bla
和主要的webpack
./Modules/Bla/webpack.mix.js
./Modules/Bla/Resources/assets/js/bla.js
./Modules/Bla/Resources/assets/scss/bla.scss
./Modules/Bla/Resources/assets/images/module-icon-example-1.png
./Modules/Bla/Resources/assets/images/module-icon-example-2.png
您需要修改./webpack.mix.js
./resources/js/app.js
./resources/sass/app.scss
./resources/img/main-icon-example-1.png
并添加此行
./resources/js/app.js
您也需要...
require('./bootstrap');
...
require('../../Modules/Bla/Resources/assets/js/bla');
进行修改,并添加此行
./resources/sass/app.scss
对于需要修改// Variables
@import 'variables';
// Bootstrap
@import '~bootstrap/scss/bootstrap';
// PersonalizedModule
@import './../../Modules/Bla/Resources/assets/sass/bla';
的图像,请添加以下行。特别是./webpack.mix.js
或copyDirectory
,它们都使用不同的方法。
copy
运行:
mix.react('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
.copyDirectory('resources/img', 'public/img')
.copyDirectory('Modules/Bla/Resources/assets/img', 'public/img');
或
>npm run development -- --watch
目前,您拥有>npm run production
public/app.js
,其中所有代码都在模块中,并且包含所有图像的目录public/app.css
。
缺点:生成的public/img
文件很大(可以解决吗?)
我认为最好的方法是对所有webpack.mix.js进行级联,但是我还没有找到一种简便的方法。