【问题标题】:Minify Scripts/CSS in production mode with node.js使用 node.js 在生产模式下缩小脚本/CSS
【发布时间】:2013-02-12 20:35:42
【问题描述】:

我有一个在 node.js 中运行的网络应用程序。目前所有(客户端)Javascript/CSS 文件都没有被压缩,以便于调试。

当我开始生产时,我想缩小这些脚本。最好有类似的东西:

node app.js -production

如何在不更改 html 文件中的脚本标签的情况下提供脚本的缩小版本?应该是这样的:如果我在生产中,使用这 2 个缩小(组合)脚本,否则使用我所有未缩小的脚本..

这可能吗?可能是我想的太复杂了?

【问题讨论】:

    标签: javascript css node.js minify production


    【解决方案1】:

    您可能对Piler 感兴趣。它是一个 Node.js 模块,可在调试模式下像往常一样提供您指定的所有 JavaScript(和 CSS)文件,但在生产模式下会连接并缩小。

    作为一项特殊功能,您可以通过 Socket.io 强制 CSS 更新实时显示在您的浏览器中(在 Piler 中称为“CSS Live Updated”),这非常棒:-)。

    诀窍在于,在您的模板中,您只有 scriptlink 元素的占位符,并且 Piler 在运行时呈现这些元素 - 在调试模式下作为单个元素,在生产模式下作为动态生成的单个元素.

    通过这种方式,您可以忘记手动或使用构建工具创建资产的串联和缩小版本,它仅在运行时存在,但在开发和调试时您始终拥有分离的完整版本。

    【讨论】:

      【解决方案2】:

      您可以为静态文件使用 2 个单独的位置

      这里有一些快速代码:

      if (process.env.MODE === "production") {
        app.use(express['static'](__dirname + '/min'));
      } else {
        app.use(express['static'](__dirname + '/normal'));
      }
      

      并以

      开始节点
      MODE=production node app.js
      

      此外,如果您不想复制所有文件,您可以利用 express 静态路由器在第一个文件处停止的事实,并改为执行以下操作:

      if (process.env.MODE === "production") {
        app.use(express['static'](__dirname + '/min'));  // if minized version exists, serves it
      }
      app.use(express['static'](__dirname + '/normal'));  // fallback to regular files
      

      不过,是否最小化使用相同的名称会导致浏览器缓存出现问题。

      【讨论】:

      • @Pascal,快速提问 - 您是否建议缩小的 js 文件应该存在于该文件夹中?如果是这种情况,每次发生更改时您都必须在系统上构建它,然后使用 git 等将其推送到生产环境,这似乎不是一个好主意。
      • 不,缩小的文件通常不应该存储在 git 中。服务器本身或grunt 之类的东西都可以在生产服务器上使用来生成缩小版本。
      • 要在生产模式下使用以下 NODE_ENV=production node app.js
      【解决方案3】:

      我想与你们分享我的最终解决方案。

      我将 JSHTML 用于 Express (enter link description here)

      在我的主节点文件中,我使用了一个特殊的路由:

      app.get('/**:type(html)', function (req, res, next) {
      var renderingUrl = req.url.substring(1, req.url.lastIndexOf("."));
      //TODO: Find a better solution
          try{
              var assetUrl = req.url.substring(req.url.lastIndexOf("/") + 1, req.url.lastIndexOf("."));
              var assets = config.getResourceBundle(assetUrl);
              assets.production = config.getEnviroment() === "production";
              res.locals(assets);
              res.render(renderingUrl);
          }catch(e){
              res.redirect("/");
          }
      });
      

      如您所见,我从 config.getResourceBundle 获取资产。这是一个简单的函数:

      exports.getResourceBundle = function(identifier){
          switch(enviroment){
              case "development":
                  return devConfig.getResourceBundle(identifier);
              case "production":
                  return prodConfig.getResourceBundle(identifier);
              default:
                  return devConfig.getResourceBundle(identifier);
          }
      }
      

      最后是一个资产文件集合的例子:

      exports.getResourceBundle = function (identifier) {
          return resourceBundle[identifier];
      };
      
      
      resourceBundle = {
          index:{
              cssFiles:[
                  "resources/dev/css/login.css",
                  "resources/dev/css/logonDlg.css",
                  "resources/dev/css/footer.css"
              ],
              jsFiles:[
                  "resources/dev/js/lib/jquery/jquery.183.js",
                  "resources/dev/js/utilities.js",
                  "resources/dev/js/lib/crypto.3.1.2.js"
              ]
          },
          register:{
              cssFiles:[
                  "resources/dev/css/login.css",
                  "resources/dev/css/modalDialog.css",
                  "resources/dev/css/footer.css"
              ],
              jsFiles:[
                  "resources/dev/js/lib/jquery/jquery.183.js",
                  "resources/dev/js/utilities.js",
                  "resources/dev/js/lib/crypto.3.1.2.js",
                  "resources/dev/js/lib/jquery.simplemodal.js",
                  "resources/dev/js/xfiles.register.js"
              ]
          }
      (...)
      

      我有 2 个文件夹。开发/产品。 grunt 会将缩小后的文件复制到 prod/.. 并从 dev/... 中删除文件 如果 NODE_ENV 变量设置为生产,我将发布我的脚本/css 的缩小版本。 我认为这是目前最优雅的解决方案。

      【讨论】:

        【解决方案4】:

        有适合​​你的构建工具插件,可以帮你优雅的解决这个问题:

        对于 Gulp: https://www.npmjs.org/package/gulp-useref/

        对于咕噜声: https://github.com/pajtai/grunt-useref

        【讨论】:

          【解决方案5】:

          另一个可能相关的 Node.js 模块是 connect-cachify

          它似乎并没有为你做实际的缩小,但它确实让你在生产中提供缩小版本,或者在开发中提供所有原始脚本,而无需更改模板(感谢 cachify_jscachify_css )。

          似乎没有Piler那么丰富,但可能更简单一些,应该满足问题中提到的所有要求。

          【讨论】:

            猜你喜欢
            • 2020-05-18
            • 1970-01-01
            • 2020-10-22
            • 2023-03-10
            • 2021-04-14
            • 1970-01-01
            • 2017-03-04
            • 2020-08-16
            • 2018-11-12
            相关资源
            最近更新 更多