有没有办法在咖啡脚本中包含文件?

Posted

技术标签:

【中文标题】有没有办法在咖啡脚本中包含文件?【英文标题】:Is there a way to include file in coffee script? 【发布时间】:2011-12-04 19:27:05 【问题描述】:

我想知道是否有办法在咖啡脚本中包含文件。 类似于 C 中的 #includephp 中的 require...

【问题讨论】:

见***.com/questions/6150455/… 【参考方案1】:

coffeescript-concat怎么样?

coffeescript-concat 是一个预处理和连接的实用程序 CoffeeScript 源文件。

它可以很容易地将您的 CoffeeScript 代码保存在单独的单元中,并且 仍然可以轻松运行它们。你可以保持你的源在逻辑上分开 没有将它们放在一起运行或嵌入的挫败感 一个网页。此外,coffeescript-concat 会给你一个 可以轻松编译为单个 javascript 文件的源文件。

【讨论】:

Jason 是正确的:您需要查看外部工具来执行此操作。这不是语言中包含的功能。 我不推荐coffeescript-concat,改为查看npmjs.org/package/grunt-sprockets-directives【参考方案2】:

我发现在处理它们之前使用“gulp-concat”来合并我的咖啡脚本就可以了。它可以通过 npm 轻松安装到您的项目中。

npm install gulp-concat

然后编辑你的 gulpfile.js:

var gulp = require('gulp')
,coffee = require('gulp-coffee')
,concat = require('gulp-concat');

gulp.task('coffee', function()
  gulp.src('src/*.coffee')
    .pipe(concat('app.coffee')
    .pipe(coffee(bare: true).on('error', gulp.log))
    .pipe(gulp.dest('build/')
)

这是我在 gulp 将其处理为最终构建 Javascript 之前用于连接所有咖啡脚本的代码。唯一的问题是文件按字母顺序处理。您可以明确说明要处理的文件以实现您自己的文件顺序,但您会失去添加动态 .coffee 文件的灵活性。

gulp.src(['src/file3.coffee', 'src/file1.coffee', 'src/file2.coffee'])
  .pipe(concat('app.coffee'))
  .pipe(coffee(bare: true).on('error', gulp.log))
  .pipe(gulp.dest('build/')

gulp-concat 自 2015 年 2 月 25 日起可在此网址获得。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。 干杯!我是新来这里做贡献的。我会编辑这个。【参考方案3】:

你可以试试我制作的这个库来解决同样的问题coffee-stir 它非常简单。 只需输入#include 和要包含的文件的名称

#include MyBaseClass.coffee

了解详情 http://beastjavascript.github.io/Coffee-Stir/

【讨论】:

Coffee-stir 有几个缺点:1)它在处理后添加了多余的文本,因此您可以在管道中使用它(或者您必须以某种方式删除最后一行)2)它可以' t 直接编译成.JS 你是对的。如果我使用“require”它包括两个文件。【参考方案4】:

Tl;DR:Browserify,可能使用像 Grunt 这样的构建工具...

解决方案审查

构建工具+导入预处理器

如果您想要在浏览器中运行单个 JS 文件,我建议使用像 Grunt(或 Gulp,或 Cake,或 Mimosa,或 any other)这样的构建工具预处理您的 Coffeescript,以及一个 include/require/import 模块,该模块会将包含的文件连接到您的编译输出中,例如以下之一:

Browserify:可能是上升的标准,也是我个人最喜欢的,让您可以在代码中使用 Node 的 exports/require API,然后将所需的所有内容提取并连接到浏览器包含的文件中。存在于Grunt、Gulp、Mimosa 以及可能大多数其他的。时至今日,我认为,如果您希望同时兼容 Node 和浏览器(甚至不兼容),这可能是最好的解决方案 一些类似 Rails Sprocket 的解决方案,如 grunt-sprockets-directives 或 gulp-include 也可以与 CSS 预处理器以一致的方式工作(尽管这些预处理器通常有自己的导入机制) 其他解决方案包括grunt-includes 或grunt-import

独立的导入预处理器

如果您希望避免构建工具的额外复杂性,您可以使用独立的Browserify,或不基于Node 的require 的替代方案,例如coffeescript-concat 或Coffee-Stir

[不推荐]异步动态加载(AJAX + eval)

如果您是专门为浏览器编写的,并且不介意,或者说真的希望您的脚本分布在通过 AJAX 获取的多个文件中,您可以使用多种工具,例如:

yepnope.js 或 Modernizr 的 .load 基于 yepnope:请注意,yepnope 现在已被其维护者弃用,他们建议使用构建工具和连接而不是远程加载 RequireJS HeadJS jQuery's $.getScript 原版 AJAX + 评估 你自己实现的AMD

【讨论】:

【参考方案5】:

Rails 使用 sprockets 来执行此操作,并且此语法已适应 https://www.npmjs.org/package/grunt-sprockets-directives。很适合我。

【讨论】:

【参考方案6】:

如果您将 coffeescript 与 node.js 一起使用(例如,使用命令行工具 coffee 时),那么您可以像使用 JS 文件一样使用 node 的 require() 函数。

假设您想在main.coffee 中包含included-file.coffee

included-file.coffee:声明并导出要导出的对象

someVar = ...
exports.someVar = someVar

然后你可以在main.coffee 中说:

someVar = require('included-file.coffee').someVar

这为您提供了清晰的模块化,并在包含外部代码时避免了命名空间冲突。

【讨论】:

如果不使用另一个插件 js 文件,你是怎么克服不进入浏览器的? @Lpc_dark:这个解决方案是关于服务器上的 node.js。它在 node.js 不可用的浏览器中不起作用,除非您执行类似***.com/questions/5081191/… 的操作(不过我自己还没有尝试过)。 我发现这篇文章对这个解决方案很有用:Where Does Node.js And Require() Look For Modules?

以上是关于有没有办法在咖啡脚本中包含文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash shell脚本中包含文件

是否可以在 shell 脚本中的多行命令中包含内联注释? [复制]

自动化测试脚本中包含adb命令,jenkins构建时找不到adb解决办法

将角种子茉莉花单元测试转换为咖啡脚本

脚本变量中包含空格的解决办法

有没有办法以更像咖啡脚本的方式扩展原型?