能够在每次文件更改时(无需重新加载页面)注入新修改的 CSS,这种工作流程增强功能您永远不会真正欣赏……直到您失去它。
这正是我最近遇到的情况。
至少在过去的 12 个月里,我一直在使用 Grunt 和 LiveReload 浏览器扩展 在我的文件更改时注入 CSS。它感觉像一个非常好的工作流程,直到我不得不处理一个需要 IE7 和 IE8 支持的项目。我使用的 LiveReload 插件根本不支持旧版本的 IE。一年多来,我第一次不得不每次更改 CSS 时都手动刷新页面。这太痛苦了。这也是我构建 **Browser-Sync** 的原因。
介绍 Browser-Sync
Browser-sync 是一种工具,它为您提供跨浏览器 CSS 注入功能。它会监视您的文件,并且您进行更改的那一刻,它就会通知所有连接的浏览器重新加载(注入)新的 CSS。所有这些都在不重新加载页面的情况下完成。最重要的是,它适用于我能够测试的每个浏览器。

Browser-Sync 的诞生
我从一开始就知道,简单地将新的 CSS 插入浏览器非常容易。我必须解决的问题是如何将文件系统更改传达回浏览器。我之前使用的 Grunt + LiveReload 组合依赖于 WebSockets。这就是为什么它不支持旧版 IE 的原因。
认识 Socket.io
当我使用 Karma 运行单元测试时,我灵光一现。Karma 允许您在多个浏览器中运行测试。有一天,我在 IE8 中进行测试时,意识到 Karma 会在每次文件保存时自动重新运行测试。
Bingo。我找到了能够监视文件系统更改并向所有浏览器通报更改的内容。我开始深入研究 Karma 的源代码。最终,我发现他们正在使用 Socket.io 来实现这一点。
开始融合
一切都已就绪。以手动页面刷新带来的痛苦为动力,以 Socket.io 的发现为灵感,我已做好充分准备,构建一个我每天都会使用的工具。
设置
本指南假设您已经在项目中安装了 Grunt 并知道如何使用它。如果您不知道,则可以在 Grunt 网站上了解它。
Browser-sync 可以作为独立的命令行工具安装,也可以作为 Grunt 插件安装。由于 Grunt 目前很流行,因此我将重点介绍如何将其设置为 Grunt 任务。如果您更喜欢仅使用命令行的方法,请查看这些说明。
从与您的 Gruntfile.js 相同的文件目录中
npm install grunt-browser-sync
这会将 Browser-sync 本地安装到您的项目中。现在,您可以确保 Grunt 加载它,方法是在 Gruntfile.js 的末尾附近放置以下内容
grunt.loadNpmTasks('grunt-browser-sync');
最后,与所有 Grunt 插件一样,您需要提供一些配置。至少,您需要以下内容
// Inside the Gruntfile.js config object
browser_sync: {
files: {
src : 'assets/css/style.css'
}
}
当我尝试按照文章中的步骤操作时,我有点困惑。它根本不起作用 - 所以我去了官方网站 并阅读。似乎步骤发生了一些变化,而不是将任务命名为“browser_sync”,它应该说“browserSync”,否则 grunt 不会运行该任务。
设置完配置后,您可以使用以下命令运行插件
grunt browser_sync
现在您应该会收到一个 HTML 代码片段,您可以将其粘贴到网站的页脚中。将其放置在那里。现在,每当您更改该 CSS 文件(或它被另一个构建过程更改)时,它都会自动注入到所有浏览器中。
注意:有多种方法可以指定多个文件,您也可以使用通配符(*)。有关更多信息,请参阅Github 上的自述文件。
更自动化的方式
上面的示例非常适合您已经拥有服务器的情况。例如,使用 WordPress 或 Rails 构建网站。但缺点是您需要手动将代码片段复制并粘贴到文件中。如果您使用的是静态文件(HTML、CSS 和 JS),则可以使用内置服务器。内置服务器会自动插入任何所需的 HTML 代码片段,因此您无需手动操作。
要使用内置服务器,只需像这样设置您的配置。
// Inside the Gruntfile.js config object
browser_sync: {
files: {
src : 'app/css/style.css'
},
options: {
server: {
baseDir: "app"
}
}
}
现在将从 app
目录提供文件,并且会为您完成注入 CSS 所需的所有操作。
更进一步
如果您使用上面的服务器选项,您是否注意到使用的 IP 地址和端口?通常类似于 192.168.0.8:3001
?Browser-sync 尝试找出用于服务器的合适的外部 IP 地址。这意味着您应该能够从同一 WiFi 网络上的任何设备/计算机连接到它。这里很酷的一点是,CSS 注入也适用于所有移动设备和平板电脑。当您看到这种自动化操作时,您会发现很难离开它。
如果它对您不起作用
在我的测试中,我发现,在典型的 WiFi 网络中,Browser-sync 在获取正确的 IP 地址方面做得非常出色。但是,在大型办公室设置中,您可能会发现它选择的 IP 地址无法被其他设备/计算机访问。如果是这种情况,并且您知道正确的 IP 地址,只需将其作为选项提供,如下所示
// Inside the Gruntfile.js config object
browser_sync: {
files: {
src : 'app/css/style.css'
},
options: {
server: {
host: "192.168.1.1",
baseDir: "app"
}
}
}
超越 CSS 注入
作为 CSS-Tricks 上的客座文章,我主要关注了设置工具的 CSS 注入部分。但 Browser-sync 的功能远不止于此!它有一个很棒的功能,叫做幽灵模式。
幽灵模式将跟踪所有连接的浏览器并保持以下内容同步
- 滚动位置 – 在使用多显示器开发时非常有用
- 表单字段 – 在一个浏览器中填写表单,所有其他浏览器都将填充这些数据。
- 链接 – 正在查看新构建网站的几个页面?在所有设备上打开它,当您从一个页面导航到另一个页面时,所有浏览器都将跟随您!
总结
我希望这一切对你来说听起来都很酷。我非常喜欢构建 Browser-sync。我欢迎反馈和问题报告,以便我们能够作为一个社区来改进它。
请记住,Browser-sync 可以通过两种方式使用
Shane,干得漂亮!
谢谢!这太有帮助了!
哇!这是一个非常酷的工具!!我肯定要开始使用它!!!
这是我最新版本的 Visual Studio 中的一个功能,我绝对爱上了它!每次我保存时页面都会重新加载我的样式,这是一件多么小的事情,却让我的日子变得好多了 :)
这太不可思议了,谢谢。
作为一个前端开发人员,我之前就知道 Grunt.js,读完这篇文章后,我现在正在他们的网站上阅读如何使用它。
说实话,虽然我非常想让它工作并试一试,但我还是忍不住会感到痛苦,就像我尝试设置 Sass 时一样,顺便说一句,我对 CMD 一点也不害怕。有些事情就是不适合前端开发人员。
话虽如此,为了 PC 端的前端开发人员,这里有一个非常愚蠢的新手问题(们):这些说明只适用于 Mac 吗?还是也适用于 PC?或者这些问题太蠢了?(不要回答最后一个:p,你的评论(们)会说明一切:])。谢谢!
我理解你关于设置 Grunt 的感受。
这是那些一开始令人沮丧的事情之一,但如果你坚持下去并让这些工具工作起来——我保证你不会后悔的。
我在我的日常工作中为WeAreJH工作,我们最近抽出了一些时间举办了一个 Grunt 研讨会,这真的帮助我们的前端开发人员/设计师理解了一些常见错误/问题。现在他们完全被它征服了。
看看这里的配置,看看你是否能使其工作。
Gruntfile.js 示例
回答你关于 PC/Mac 的问题:在 Windows 和 Mac 上使用 Browser-sync 是一样的。我已经测试过(甚至修改了一些代码)以确保你在任何平台上都能获得相同的工具。(我承认我没有在任何基于 Linux 的机器上进行测试)。
嘿,Ricardo,
为自己设置一个某种形式的样板...这将有助于设置 Grunt.js/Node,并可能让你获得一些“啊哈!”时刻。
查看类似 ngBoilerplate 的东西。它在一个盒子里包含了一个项目,可能会帮助你解决一些 Node 和 Grunt 的问题。(但是它是用 AngularJS 编写的,所以如果你不熟悉 AngularJS,可能需要找到替代品)。
它不是只针对 MAC 的。SASS 有 Compass,它是在 Mac 上的,所以你经常听到它。
在阅读了你下面的评论“......(以及不使用 Grunt)”之前,我并没有完全清楚 Browser Sync 可以在没有 Grunt 的情况下运行。我通过命令提示符运行它,它工作了*。
不确定其他不知道如何使用 Grunt 的前端开发人员是否会因为认为这只能与 Grunt 一起使用而感到气馁,因为尽管你提到它可以作为“......独立的命令行工具”运行,但这部分内容似乎不够清晰。
无论如何,*我能够让它监视一个测试的
/css
文件夹和一个测试的index.html
文件,但是,我无法让我的浏览器“看到”HTML 文件。所以我有几个问题。我可以在哪里提交关于我案例的问题,在 Github 仓库的问题跟踪器中?在这里?还有其他地方吗?
提前感谢。
难以置信,我能够让它工作了!
问题是,我所做的事情既没有在这里描述,也没有在仓库的 README.md 说明中描述。
我会尝试想出一些东西,以便让其他人知道这些信息。
——
在尝试了其他许多“实时注入”工具后,我终于找到了一种方法,可以在不刷新且无需使用某些复杂框架或库的情况下查看我的更改实时发生。
Shane 先生,非常感谢您。
非常感谢 :)
这个工具真的很棒。我已经使用过很多次了,可以说我非常喜欢它。
是否有计划将此工具变成类似 GhostLab 的东西,其中有一个界面可以将所有这些内容插入,而无需 Grunt 配置步骤?不是说我抱怨——我觉得 Grunt 很容易使用,也不介意设置,但我想到那些不太舒服的人。
无论如何——继续在这里做你出色的工作,Shane,我喜欢这个工具,并期待着看到它未来的发展 :)
是的,我计划开发一些小型界面功能(例如通知、断开单个浏览器的能力,或无需返回命令行即可启用/禁用幽灵模式等)。
我还想集成像 weinre 这样的调试工具,它可以通过你的主浏览器远程调试移动设备。(所以想象一下运行 Browser-sync 及其所有功能 + 你会得到一个网页,其中列出了所有连接的浏览器——你可以选择一个并使用 Chrome 开发者工具开始调试它!)。
基础设施已经到位,可以构建一些非常棒的功能。
很高兴你喜欢它,并感谢你在早期阶段在@wearejh 帮助推动它的发展:p
毫无疑问,这是一个很棒的工具。但是,在我爱上 livejs.com 之后,很难抵挡如此简单的设置。它只是一个你包含在页面中的单个 js 文件,它会自动插入更新的 css 文件、js 文件,甚至在 html 更改后刷新页面(可配置)。它使用起来非常简单。但它没有这个设置的所有强大功能。但只要我是一个编码设计师,这就足够了。
这只是我们武器库中的另一件武器。无需道歉,因为你已经喜欢其他东西了! :)
我喜欢任何/所有帮助自动化我们工作流程的工具。
不过可能值得一提的是,如果你正在使用 html、css 和 js,那么 Browser-sync 可以使用单个命令(以及不使用 Grunt)来使用。查看文档
哇,很棒的东西。
你能解释一下如何使用 Mamp 设置它吗?
谢谢,
Flo
此工具可以与 Mamp 一起使用,没有问题。只需按照文档中的说明运行它,你就会得到一个 HTML 代码段,可以将其粘贴到网站的页脚中。
不过,要获得全部好处,你需要通过 IP 地址连接到你的 Mamp 服务器(你可以在 Mamps 服务器设置中配置此设置)。
如果你需要进一步帮助查找要使用的正确 IP,碰巧我构建了一个小工具来帮助你:p
dev-ip – 查找适合的 IP 主机以在本地查看网站
非常感谢!我一直都在等待一个很棒的 LiveReload 替代方案,哦,哦,哦,很长时间了……我太高兴了,我忍不住要唱歌了!
看起来不错,但我认为 livereload 也处理 html 和 javascript 更改。
Browser-sync 可以处理任意数量的文件,并在可能的情况下重新加载/注入。
Grunt 配置示例
或者,如果你正在独立使用它,你可以传递一个配置文件,如文档中所述
嗯,为什么你不只是为 livereload 提交一个 PR,以便在它不支持 websockets 时有一个回退?
Browser-sync 最终拥有足够多的额外功能,使其成为自己的项目。
从来没有真正充分的理由使用 Grunt,但这太棒了,更不用说非常实用。我也厌倦了在多个浏览器中进行同样的刷新。我肯定要安装它。不过,你的工作做得很好。
别忘了如果需要,它可以在没有 Grunt 的情况下使用。
独立的浏览器同步
感谢您提供如此棒的工具!
是否有相反的解决方案?将开发工具的更改保存到开发服务器文件?
那将是一个很酷的功能!
我认为 Emmet 已经拥有此功能。
http://emmet.io/
使用命令行很容易设置。它显示正在监视 1 个文件(我的 style.css)……但是。我在浏览器中不断收到
无法获取 /add-member.php
你能否解释一下为什么会发生这种情况?我的地址栏显示:http://192.168.1.65:3001/add-member.php
我的配置文件是
module.exports = {
files: “*.css”,
debugInfo: true,
host: “192.168.1.65”,
ghostMode: {
links: true,
forms: true,
scroll: true
},
server: {
baseDir: “/mvyc/”
},
open: true
};
谢谢
@Vahagn
有 livestyle 它是新的 http://livestyle.emmet.io/ 并且有 DevTools Autosave 不确定它有多活跃,它只在 Chrome 中工作 https://github.com/NV/chrome-devtools-autosave
这太棒了,我喜欢!我注意到的一件事是,在开发过程中使用此“技巧”绕过 IE 对样式表数量的限制时,它不起作用。
有趣!
您能否在 GitHub 上将此作为问题/功能请求提交,并提供更多详细信息?
谢谢
嘿 Shane,
我。爱。浏览器同步!
非常感谢您开发此功能,并通知您
它在我的两个 Linux 系统(Linux Mint 15 和 Ubuntu 13.04)上运行完美。
很高兴知道这一点,因为我没有机会在任何 Linux 发行版上进行测试(除了 CI 服务器构建)。
谢谢,很高兴你喜欢它 :)
你好 Shane,
我们可以在自定义 javaEE 项目(非 node.js 项目)中使用它吗?如果是,需要任何额外的配置?
谢谢
Shane 非常感谢你!这真是太棒了,并且节省了我很多时间。在我保存编辑器文件后,它会立即刷新浏览器。
祝福
Norman
你好!
我刚接触 Grunt,所以我在一个新文件夹中设置了一个简单的 Grunt。我按照此处描述的安装了 Browser-sync,并使用了最少的设置
browser_sync: {
files: {
src : ‘css/style.css’
}
}.
没有安装服务器或任何其他东西,只有 Grunt 和 Browser-sync。
当我运行 grunt browser_sync 时,我得到的只是“Browser Sync 未找到任何要监视的文件”。
我是否遗漏了什么,是否存在与 Windows 相关的任何问题?
ps:命令行版本在我的路径上找到了 4 个 .css 文件,插件就是不想找到我的 css 文件:)。
我如何在同时使用 watch 插件的同时使用此插件?因为我正在使用 LESS 和 watch 插件来处理它,如果我不能同时使用这两个插件,那么这个插件就没什么用了。运行 `grunt browser_sync` 会运行插件,但是只运行 `grunt` 只会运行 watch。
Grunt 新手,抱歉!
我不确定这是否是最好的方法,但我现在正在使用 grunt-shell 和 `grunt watch & grunt browser-sync` 来同时运行它们。
感谢您提供这个很棒的插件,这太棒了!
成功使用 Chrome 开发者工具使其工作。我使用 Chrome 工作区[可在开发者工具中使用]将我的 css 文件映射到实际的源文件,并在浏览器同步上进行设置以监视 css 文件,这会自动将 css 注入到所有连接的设备中,反映我在开发者工具中对所有连接设备所做的任何更改。太棒了!!
但是我确实不得不在“browser-sync-client.js”中进行更改以使其工作,因为当浏览器同步注入 css 文件时,它会为新注入的 css 文件添加时间戳。所以我将“browser-sync-client.js”中的以下行 **elem[attr] = currentValue + “?rel=” + timeStamp;** 更改为 **elem[attr] = currentValue;**。如果没有更改,则 css 注入将仅在第一次使用 Chrome 开发者工具时工作。
嗨 Chris,
感谢您关于 Grunt 的精彩文章……它让我的工作流程变得美好。
现在我在浏览器同步中收到错误。
警告:找不到模块“optimist” 使用 –force 继续。
此致,
Jesudas