渲染javascript文件,同时使其作为静态文件可用

Render javascript file, while making it available as a static file

本文关键字:文件 静态 javascript 渲染      更新时间:2023-09-26

我有一个javascript文件访问的url,如"/js/someFile.js"。然而,我希望Yii渲染javascript文件时,它已被请求,所以我可以包括相关的数据,例如从数据库表解析列表。

我明白一个解决方案是简单地使文件静态,并在初始化时从服务器请求数据,但是我希望不要这样做。

有没有人知道如何实现这一点,而不把JS内联在当前视图?或者有什么理由证明这是个糟糕的主意吗?

可以呈现Twisted1919所示的视图。但我确实认为这不是一个好主意,通过Yii渲染javascript。你的问题已经暗示,javascript文件几乎是静态的。所以把它当作一个静态文件,这样你的web服务器可以更快地为它服务。在客户端缓存这个文件更容易。

然后,正如你所建议的,试着用一种方式来写,你只需要把动态部分作为参数传递给你的javascript。但是,您不必像您暗示的那样从服务器请求该数据。您可以将配置内联添加到您的页面:

<?php
$data = json_encode(array(
    'userId'    => Yii::app()->user->id,
    'whatever'  => $someThing,
));
Yii::app()->clientScript->registerScriptFile('my.js');
Yii::app()->clientScript->registerScript(
    'initJs',
    "myJs.init($data)", 
    CClientScript::POS_READY
);
?>

你可以有一个叫做js或javascript的特殊控制器来调用它而不是调用静态js文件:

class JsController extends Controller{
   public function init() {
       header('Content-Type: application/javascript');
   }
   public function actionSome_action(){
      $this->render('some_action_view_file');
   }
}

你甚至可以为它定义一个重写规则,这样你就可以为你的url拥有。js扩展名。

接下来,在控制器中输入:

class SiteController extends Controller {
   public function actionIndex() {
      // register the script
      Yii::app()->clientScript->registerScriptFile($this->createUrl('js/some_action'));
      // do other things here...
   }
}