我有一个这样声明的对象:
my.namespace.FEATURES = {
FIRST_FEATURE = "first feature",
SECOND_FEATURE = "second feature"
};
Run Code Online (Sandbox Code Playgroud)
我my.namespace.my.object用来跟踪我的代码中可用/实现的功能类型。每个新发布的版本都会有一组经过修改的功能。使用我的最小化代码的第三方会想知道他们在他们拥有的版本中可以做什么,所以我提供了以下导出的函数,以便他们知道他们可以做什么。
my.namespace.hasFeature = function(feature) {
for(var prop in my.namespace.FEATURES) {
if(my.namespace.FEATURES[prop] == feature) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
问题是当我运行 Closure Compiler 时属性被重命名。
我的问题是:保留这些属性的最佳方法是什么?我知道我可以导出该属性,但由于某种原因感觉有点脏。是否有 Closure 最佳实践来保留对象的属性?
我运行非常基本的文件:
goog.provide('test');
goog.require('goog.net.XhrIo');
goog.require('goog.json.Serializer');
goog.require('goog.dom');
goog.require('goog.ui.HoverCard');
goog.require('goog.positioning');
goog.require('goog.dom.dataset');
Run Code Online (Sandbox Code Playgroud)
但我明白了
test.js:3: ERROR - required "goog.net.XhrIo" namespace never provided
goog.require('goog.net.XhrIo');
Run Code Online (Sandbox Code Playgroud)
在编译时
java -d32 -client -jar compiler/compiler.jar --js compiler/closure-library/closure/goog/base.js --js test.js --warning_level=VERBOSE
Run Code Online (Sandbox Code Playgroud)
如何找到goog库?
编辑:
我也尝试使用在线版:http://closure-compiler.appspot.com/home并仍然获得:
JSC_MISSING_PROVIDE_ERROR: required "goog.net.XhrIo" namespace never provided at line 3 character 0 in test.js
goog.require('goog.net.XhrIo');
^
JSC_MISSING_PROVIDE_ERROR: required "goog.json.Serializer" namespace never provided at line 4 character 0 in test.js
goog.require('goog.json.Serializer');
^
JSC_MISSING_PROVIDE_ERROR: required "goog.dom" namespace never provided at line 5 character 0 in test.js
goog.require('goog.dom'); …Run Code Online (Sandbox Code Playgroud) google-closure google-closure-library google-closure-compiler
VS Code 解析以下内容,就好像没有感叹号一样,没有任何错误:
const el = /** @type {HTMLElement!} */ (document.getElementById("abc"));
Run Code Online (Sandbox Code Playgroud)
它有什么作用?官方 JSDoc 文档仅说明了前面的标记:
表示该值属于指定类型,但不能为空。
不确定后续标记的作用。
我试图以编程方式访问Closure Compiler工具,但是在PHP和JavaScript方面都存在问题.这是一个快速而肮脏的PHP脚本,我只是为了解决编译器的REST API:
<?php
if (!empty($_POST)) {
echo '<pre>';
print_r($_POST);
echo '</pre><br />';
foreach ($_POST as $k => &$v) $v = urlencode($v);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
curl_setopt($ch, CURLOPT_URL, 'http://closure-compiler.appspot.com/compile');
echo curl_exec($ch);
} else {
echo "
<html>
<body>
<form action='' method='post'>
<p>Type JavaScript code to optimize here:</p>
<textarea name='js_code' cols='50' rows='5'>
function hello(name) {
// Greets the user
alert('Hello, ' + name);
}
hello('New user');
</textarea>
<input type='hidden' …Run Code Online (Sandbox Code Playgroud) 我正在服务器上生成一个javascript,并希望运行Google Clousure Compiler来运行脚本的php源代码.
var jsvar = <?=$var ? true : false ?>;
Run Code Online (Sandbox Code Playgroud)
如果有任何方法告诉编译器跳过优化,只是徘徊?像正则表达式跳过:
/<\?=.*?\?>/
Run Code Online (Sandbox Code Playgroud)
最好的祝福,
尼克拉斯
我想用war文件中的最小化版本(由Closure Compiler最小化 - https://developers.google.com/closure/compiler/docs/gettingstarted_app)替换js 文件.为了建立战争,我正在使用蚂蚁:
...
<target name="war" depends="buildnumber" description="--> Creates a WAR of a Grails application">
<grails command="war" environment="${grails.env}"/>
</target>
...
Run Code Online (Sandbox Code Playgroud)
我补充说:
grails.project.resources = { stagingDir ->
delete(file:"${stagingDir}/js/*.js")
}
Run Code Online (Sandbox Code Playgroud)
到<root>\grails-app\conf\BuildConfig.groovy但是没有删除war文件的js文件.
如何在ant构建文件中提供最小化的文件列表,以及如何将其添加到最终war文件中?
更新:
我在\ grails-app\conf\BuildConfig.groovy中添加了以下内容,将最小化的文件复制到war文件中.在第一步中,ant最小化js文件.在下一步中生成war文件,此步骤用最小化文件替换原始js文件.
grails.war.resources = { stagingDir, args ->
def jsFiles = [
'file1.js',
'file2.js',
'file3.js',
...
'templates.common.js'
];
for (file in jsFiles) {
File f = new File("minimizedjs\\${file}");
if(f.exists()) {
copy(file: "minimizedjs\\${file}", tofile: "${stagingDir}\\js\\${file}")
}
else {
println('.....!');
break;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在定义一个简单的对象"浏览器",它允许从列表中显示"上一个"和"下一个"图像.
function Browser(image, elements) {
this.current = 0;
this.image = image;
this.elements = elements;
}
Browser.prototype.next = function () {
if (++this.current >= this.elements.length) {
this.current = 0;
}
return this.show(this.current);
};
Browser.prototype.prev = function () {
if (--this.current < 0) {
this.current = this.elements.length - 1;
}
return this.show(this.current);
};
Browser.prototype.show = function (current) {
this.image.src = this.elements[current];
return false;
};
Run Code Online (Sandbox Code Playgroud)
这个代码几乎被JSlint所喜欢.但是"高级优化"中的Google Closure Compiler无法编译它.
它说:
JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 3 character 0
this.current …Run Code Online (Sandbox Code Playgroud) 我试图在Windows上运行closurebuilder.py,无论我传递什么文件,我从Python得到同样的错误:
python goog\closure\bin\build\closurebuilder.py --root = goog/closure/goog/--root = closurebuilder-example/--namespace ="myproject.start"
goog\closure\bin\build\closurebuilder.py: Scanning paths...
Traceback (most recent call last):
File "goog\closure\bin\build\closurebuilder.py", line 262, in <module>
main()
File "goog\closure\bin\build\closurebuilder.py", line 200, in main
sources.add(_PathSource(js_path))
File "goog\closure\bin\build\closurebuilder.py", line 175, in __init__
super(_PathSource, self).__init__(source.GetFileContents(path))
File "C:\Users\Chris\Code\Plain\goog\closure\bin\build\source.py", line 119, in GetFileContents
return fileobj.read()
File "C:\System\Python\33\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 6857: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
无论我是在尝试构建一个简单的脚本,一个空白文件,还是一些更复杂的东西,都会出现这个错误,抱怨带有字节0x8f的UnicodeDecodeError.我正在使用Visual Studio 2012来创建这些文件,并且我尝试使用其默认编码(Windows代码页1252)和UTF-8进行保存.
为了简单起见,我试图在以下网址中构建基本示例:https://developers.google.com/closure/library/docs/closurebuilder
如果页面在这里改变了我正在使用的HTML和脚本:
HTML: …
我希望能够根据某些条件更改javascript文件中的变量和函数名称,然后输出修改后的javascript.这类似于javascript minifier的功能.这是一个例子:我有这个javascript代码
var something=5;
something++;
function doSomething(n){
alert(n);
}
doSomething(something):
Run Code Online (Sandbox Code Playgroud)
现在我想更换something,并doSomething用somethingElse和doSomethingElse,并返回下面的JavaScript代码:
var somethingElse=5;
somethingElse++;
function doSomethingElse(n){
alert(n);
}
doSomethingElse(somethingElse):
Run Code Online (Sandbox Code Playgroud)
我认为这可以在rhino或google closure编译(基于rhino)中完成,但不知道如何.我也对其他建议持开放态度.
谢谢