Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Yii2: Registering Asset Bundle vs registering external Js file

Hi I wanted to know the advantage of registering Asset Bundle following the process described in the docs like Process one in AppAsset.php

public $js = [
        'js/myjsfile.js'
    ];

then in the view file adding Namespace like

namespace app\assets;

and then adding the use statement like

use app\assets\AppAsset;
AppAsset::register($this);

Instead of doing all this if I use Process Two

$this->registerJs('js/myjsfile.js', $this::POS_READY);

it works fine. So why should I use Process One.

  1. Any advantage and reason for this will be greatly appreciated.
  2. If I follow the process one Do I need to add all the js files in AppAsset.php individually.

Thanks.

like image 344
Pawan Avatar asked Jan 25 '15 18:01

Pawan


2 Answers

Asset Bundles have some advantages over normal registering. Apart from what @deacs said in his/her answer here are others:

  1. Assets Bundles can publish the file to assets if its not in web accessible directory
  2. Assets Bundle can deal with less files (in case of CSS) as well as compressing the assets.
  3. Makes Code Elegant especially in solving dependencies and hence reusability

All the features that makes bundles shine are found in docs

like image 114
Stefano Mtangoo Avatar answered Nov 18 '22 10:11

Stefano Mtangoo


One of the main reasons for using an Asset Bundle is that your assets' paths will always be correct. Consider:

$this->registerJsFile('js/myjsfile.js', ['position'=>$this::POS_READY]);

will generate something like:

<script src="js/myjsfile.js"></script>

Which works great for non urlManager enabled urls, e.g. http://localhost/yiiproject/index.php?r=user/update&id=8 because your browser looks for the js file at: /yiiproject/js/myjsfile.js

But if you enable urlManager, your url will look like http://localhost/yiiproject/user/update/8, which means your browser will look for your js file at: /yiiproject/user/update/8/js/myjsfile.js.

You could overcome this problem by using:

$this->registerJsFile(Yii::$app->request->baseUrl.'/js/myjsfile.js', ['position'=>$this::POS_READY]);

But the Asset Bundle basicly does that for you.

like image 43
deacs Avatar answered Nov 18 '22 08:11

deacs