Installation:
composer require davidjegat/jimport-bundle
Add the bundle to config/bundles.php:
return [
// ...
DavidJegat\JImportBundle\DavidJegatJImportBundle::class => ['all' => true],
];
Configure Assetic:
In config/packages/assetic.yaml:
assetic:
bundles: ['AppBundle'] # Replace with your bundle name
First Use Case:
Create a main.js file in assets/js/ with:
@import('js/foo.js');
@import('js/rep/bar.js');
Use it in Twig:
{% javascripts 'assets/js/main.js' filter='jimport' %}
<script src="{{ asset_url }}"></script>
{% endjavascripts %}
Bundle-Aware Imports:
assetic.bundles to prioritize imports from Resources/public.@import('bundles/AppBundle/js/lib.js') will first check AppBundle/Resources/public/js/lib.js.Dynamic Asset Loading:
@import in entrypoint files (e.g., main.js) to modularize JS dependencies.// assets/js/main.js
@import('js/vendor/jquery.js');
@import('js/app/features/*.js'); // Wildcard support
Twig Integration:
{% javascripts ... filter='jimport' %} to parse imports.uglifyjs2):
{% javascripts 'assets/js/main.js' filter=['jimport', 'uglifyjs2'] %}
CSS Support:
javascripts with stylesheets in Twig).Custom Functions:
davidjegat_jimport.function (see README for interface).generateRoute function to resolve Symfony routes in JS:
# config/services.yaml
services:
App\JImport\RouteFunction:
arguments: ['@router']
tags: ['davidjegat_jimport.function']
Conditional Imports:
if (@isMobile()) {
@import('js/mobile.js');
}
Dev vs. Prod Parsing:
@import replacements.Bundle Priority:
assetic.bundles.Wildcard Limitations:
*.js) are parsed but not recursively resolved (e.g., @import('js/**/*.js') won’t work).Twig Syntax Conflicts:
@import in Twig templates (e.g., {{ asset('js/foo.js') }}). Use only in JS/CSS files.Check Parsed Output:
debug: true in assetic.yaml) to see resolved imports.File not found: js/foo.js.Custom Function Debugging:
var_dump() in execute() to inspect $arguments and $parser state.public function execute(array $args, Parser $parser) {
error_log(print_r($args, true));
return '// Debug: ' . json_encode($args);
}
Cache Issues:
php bin/console assetic:dump --watch --env=prod
Parser Hooks:
DavidJegat\JImportBundle\Parser\Parser to modify import resolution logic.preProcess() method to normalize paths.Filter Chaining:
yui_compressor) for minification:
{% javascripts 'assets/js/main.js' filter=['jimport', 'yui_compressor'] %}
Environment-Specific Imports:
@import('@env('APP_ENV') === "dev" ? "js/dev.js" : "js/prod.js"');
(Requires a custom function to evaluate JS expressions.)How can I help you explore Laravel packages today?