十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sails 资产管道中的 linkAssets.js:深入理解 Grunt 任务列表与自动资源注入机制

Sails 资产管道中的 linkAssets.js:深入理解 Grunt 任务列表与自动资源注入机制 Sails 资产管道中的 linkAssets.js深入理解 Grunt 任务列表与自动资源注入机制【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址: https://gitcode.com/gh_mirrors/sa/sails导读本文聚焦于 Sails 应用骨架中tasks/register/linkAssets.js这一 Grunt 任务列表tasklist它是 Sails 前端资产管道asset pipeline中承担自动注入script/link标签职责的关键支撑模块。通过本文你将理解linkAssets在sails lift开发流程与watch监听流程中的触发关系、它与sails-linker插件及pipeline.js的协作方式并掌握开发/生产两种环境下的资源注入差异与常见自定义手法。linkAssets.js 在 Sails 中的角色定位原文档对tasks/register/linkAssets.js的定位非常明确它不设计为被直接调用而是一个被default任务列表和watch任务调用的支撑模块supporting module。其生效前提是项目中确实在使用grunt-sails-linker这个 Grunt 插件。在 Sails 的目录结构中tasks/register/文件夹存放的是 Sails 默认运行的所有 Grunt 任务列表。这些任务列表文件本身只是编排清单——它们通过grunt.registerTask将tasks/config/下已配置好的具体任务按顺序串联起来执行。linkAssets.js正是这类编排文件之一它负责在正确的时机把编译、合并、压缩后的静态资源以标签形式链接进视图布局。从文件结构看tasks/目录被明确划分为两层见tasks.mdtasks/config/存放每个 Grunt 任务的具体配置如sails-linker.js、less.js、uglify.js、jst.js等tasks/register/存放任务列表定义按什么顺序运行哪些任务。linkAssets.js属于后者它本身不包含复杂的编译逻辑而是把资源链接这一环节编排进整体流程。谁在调用 linkAssetsdefault 与 watch 两条调用链依据原文档linkAssets被两条调用链使用前提都是grunt-sails-linker插件处于启用状态default任务列表sails lift开发模式或node app启动应用时Sails 会执行tasks/register/default.js。该任务列表完成资产编译后调用linkAssets将结果注入视图。watch任务开发模式下监听assets/目录文件变更时watch会先执行syncAssets仅同步变更文件再执行linkAssets从而让页面无需重启 Sails 即可反映最新的样式与脚本。值得注意的是syncAssets.js文档明确说明它同样不设计为被直接使用而是watch任务的支撑模块——这与linkAssets.js的定位如出一辙这些 register 文件都是任务编排的中间环节由default/watch等顶层任务列表统一调度。任务触发矩阵根据tasks.md与各 register 文件Sails 自动触发任务的对应关系如下启动命令执行的任务列表linkAssets 是否参与sails lifttasks/register/default.js是经 default 调用sails lift --prodtasks/register/prod.js间接相关生产走linkAssetsBuildProd或cssmin/uglify产物sails wwwtasks/register/build.js是经linkAssetsBuildsails www --prodtasks/register/buildProd.js是经linkAssetsBuildProdsails lift开发中watch监听触发syncAssetslinkAssets是提示register.md还指出若设置sails.config.environment为自定义值如qaSails 会优先运行同名任务列表tasks/register/qa.js不存在时才回退到default.js。这为按环境定制资源链接提供了扩展点。linkAssets 的兄弟任务linkAssetsBuild 与 linkAssetsBuildProdtasks/register/下存在三个以linkAssets命名的任务列表分工明确linkAssets.js本文主角服务开发模式被default与watch使用注入的是未经压缩的脚本与样式标签。linkAssetsBuild.js支撑build任务列表对应sails www用于构建输出到www/目录的静态站点版本。linkAssetsBuildProd.js支撑buildProd任务列表对应sails www --prod针对生产构建注入压缩合并后的资源标签。三者共享同一套sails-linker配置机制仅因面向的开发/构建/生产构建场景不同而注入不同的目标文件例如生产环境注入的是min/目录下的压缩产物。理解这一点有助于在排查为何生产页面与开发页面引用的资源路径不同时快速定位方向。底层原理sails-linker 如何完成注入注入标签与占位注释linkAssets的执行核心是sails-linker任务其配置位于tasks/config/sails-linker.js。该任务会自动把script标签和link标签注入到指定的 HTML/EJS 文件中注入位置由配置中的startTag与endTag两个分隔符决定。依据docs/concepts/Assets/DefaultTasks.md的说明脚本和样式注入只会发生在包含如下占位注释的文件中!--SCRIPTS-- !--SCRIPTS END-- !--STYLES-- !--STYLES END--这两个标签组默认包含在新建 Sails 项目的views/layouts/layout.ejs中。sails-linker扫描到!--SCRIPTS--与!--SCRIPTS END--之间的区域后会把编译好的 JavaScript 文件以script src...形式插入其间对!--STYLES--同理插入link标签。实战要点如果你不希望使用自动资源注入直接删除视图中的这两组占位注释即可linkAssets将无标签可注入不会破坏构建流程。开发环境默认的行为按sails-linker.js.md的说明开发模式下默认注入以下三类资源应用的前端 JavaScript 文件script标签CSS 样式表link标签templates/目录下预编译的客户端 HTML 模板JST参见jst任务。此外还有两个条件性行为若assets/styles/importer.less存在会先被编译为 CSS 再插入link标签对应less任务只编译importer.less以便你自行控制import顺序若assets/js/下存在 CoffeeScript 文件它们会被编译为 JavaScript 并同样注入。生产环境NODE_ENVproduction的行为生产模式下资源形态发生质变详见sails-linker.js.md的 Production 一节所有样式表含全部.css与assets/styles/importer.less会被压缩合并为单个.css文件由cssmin任务完成所有客户端脚本含.js与.coffee会被压缩合并为单个.js文件由uglify任务完成预编译的 JST 模板默认不并入压缩脚本包因为这会改变前端代码的行为如需并入需从tasks/register/prod.js的任务列表中移除clientSideTemplates并在tasks/config/uglify.js的src数组中加入.tmp/public/下编译出的jst.js。注入顺序的控制器pipeline.jslinkAssets注入标签的文件顺序并非随意而是由tasks/pipeline.js决定。该文件定义了你的样式表、JavaScript 与客户端模板文件应按什么顺序被编译并链接为script/link标签。pipeline.js支持 Grunt 风格的通配符/glob 表达式并可用!前缀排除文件。典型场景是让 jQuery 等依赖库排在业务代码之前或让 reset/mixin 样式排在业务样式之前。如果你不依赖自动资源注入则可以安全地忽略此文件——这正与linkAssets的可选性相呼应。与 default/prod 任务列表的整体协同为把linkAssets放到完整流程中理解可参考default.js.md与prod.js.md对任务列表的说明defaultsails lift或node app开发启动时执行若使用自定义环境名Sails 会优先查找同名任务列表出于历史兼容原因当环境为production如NODE_ENVproduction且找不到production.js时会先尝试prod.js再回退到default.js。prod生产环境NODE_ENVproduction node app下替代default执行其资源处理链concat→cssmin/uglify→hash缓存破坏产出的压缩资源再由链接任务注入视图。一个典型的开发模式资产流转路径可以概括为assets/ (LESS/Coffee/JS/EJS) → less / coffee / babel / copy 等编译与拷贝任务 → .tmp/public/ (中间产物) → linkAssets (sails-linker 按 pipeline.js 顺序注入标签) → views/layouts/layout.ejs 中的 !--SCRIPTS-- / !--STYLES-- 区域这也是Gruntfile.js所描述的编译 LESS、生产压缩脚本、预编译并注入客户端模板的默认资产管道的具体落地。自定义与禁用建议只想调整注入顺序修改tasks/pipeline.js中的数组顺序无需改动linkAssets.js本身。想彻底关闭自动注入从视图布局中删除!--SCRIPTS--/!--STYLES--占位注释即可。想为不同环境定制任务链参照register.md新增tasks/register/qa.js等文件并把sails.config.environment设为qaSails 将优先执行该自定义任务列表。想完全摆脱 Grunt删除项目的Gruntfile或禁用 Grunt hook也可以使用sails new的--withoutgrunt/--no-frontend选项生成不含默认前端任务的项目骨架。小结tasks/register/linkAssets.js虽是一个不面向直接调用的支撑型任务列表却是 Sails 默认资产管道中连接编译产物与视图布局的枢纽它经default任务列表在sails lift时执行经watch在开发热更新时反复执行并通过sails-linker与pipeline.js实现有序、可选的自动资源注入。理解它的触发条件、注入机制与生产差异是驾驭 Sails 前端资产工作流、乃至按需定制任务管道的起点。相关文档索引tasks/register/ 目录说明sails-linker 任务配置default 任务列表linkAssetsBuild 任务列表linkAssetsBuildProd 任务列表syncAssets 任务列表pipeline.js 注入顺序配置默认任务总览Default Tasks资产与任务自动化概念Gruntfile.js 说明【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址: https://gitcode.com/gh_mirrors/sa/sails创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表