Nwidart Laravel模块通过webpack和mix管理资源。

时间:2018-09-17 12:24:03

标签: laravel webpack laravel-mix

我正在使用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();
}

2 个答案:

答案 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.jscopyDirectory,它们都使用不同的方法。

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进行级联,但是我还没有找到一种简便的方法。