我有一个 NodeJS 应用程序,它具有基于 Express 的结构和用于视图的 Jade 模块。我需要在开发机器上使用我的资产的完整版本,在生产机器上使用最小版本。
你能解释一下我应该如何正确地做到这一点的最佳实践吗?
编辑:如果你减号,请描述原因。
不知道为什么没有“官方”的方式来做到这一点(与 Ruby on Rails 相比)。
这里有一些建议:
到目前为止,这是我一直在做的事情:
在服务器启动时,我对所有 js 文件(在 .../js 下,并在 .../min 下创建缩小版本)运行 uglify-js,如下所示(省略文件的读/写):
var jsp = require('uglify-js').parser;
var pro = require('uglify-js').uglify;
var ast = jsp.parse(code.toString('utf8')); // parse code and get the initial AST
ast = pro.ast_mangle(ast); // get a new AST with mangled names
ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
var final_code = pro.gen_code(ast); // compressed code here
然后在 html 模板中,基于一些环境变量来触发生产环境,我生成<script>
标签的路径以指向 .../js 或 .../min。
这遗漏了很多内容(您可以将所有 js 文件组合成一个最小化的文件以减少浏览器查询等的数量),但希望这可以帮助您制定自己的策略。
也就是说,我一直想尝试piler(https://github.com/epeli/piler),这似乎是DYI方式的更好替代方案。
Grunt.js ( http://gruntjs.com/ ) 也非常适合帮助预处理文件 (html, js, css, ...)
这里有几个指针:
我将缩小视为构建步骤,并且不希望在运行时给应用程序带来负担。因此,我会设置我的 HTML 文件以引用从构建工具生成的文件路径,然后使用构建工具来确定是否要缩小。
我实际上不需要自己设置条件,因为我不需要在浏览器中有未压缩的代码。使用 grunt setup 来监视源文件并自动重新编译,我可以编辑 JavaScript 源文件,它会自动重新构建并放置到适当的运行时位置。但是,我可以看到这对于单步执行代码很有用。IE 9 在其开发控制台中有一个格式化程序,可用于调试压缩代码,但我不确定这在浏览器中有多普遍。
如果我要在开发中跳过缩小,我会首先检查是否可以让 grunt uglify 任务使用环境变量或 npm 设置等配置设置来决定是否实际进行 uglify。如果那是不可能的,我会做一个名为“devBuild”的单独的咕噜任务,它会做除 uglify 之外的所有事情。