我正在使用Grunt连接grunt-contrib-uglify任务来缩小我的应用程序中的JavaScript.
在缩小时,它会删除'use strict'除第一个之外的所有语句,因此我将获得一个巨大的JavaScript文件,顶部带有"use strict"指令.
问题是全局'use strict'指令使浏览器在"严格模式"下执行我在项目中使用的每个lib的代码,并且它导致错误,因为不是每个第三方代码都是为严格模式编写的.
关于如何解决这个问题的任何想法?
我有一个使用grunt,browserify和uglify的SPA ASP.NET项目.当我尝试在Chrome调试器中查看JavaScript时,它会显示缩小的JavaScript并且似乎忽略了地图文件.在IE11和Firefox中,调试器正确显示未分析的JavaScript.我确认在Chrome选项中选中了"启用JavaScript源地图".
在Chrome中,缩小文件的最后一行是:
//# sourceMappingURL=bundledApp.min.js.map
Run Code Online (Sandbox Code Playgroud)
这是我的完整gruntfile:
module.exports = function (grunt) {
grunt.initConfig({
clean: ['dist'],
browserify: {
build: {
files: {
"dist/bundledApp.js": [
'./Scripts/jquery-2.1.4.js',
'./Scripts/underscore.js',
'./Scripts/backbone.js',
'./App/App.js',
'./App/**/*.js',
'!./App/**/*-spec.js'
]
},
options: {
alias: {
'jquery': './Scripts/jquery-2.1.4.js',
'underscore': './Scripts/underscore.js',
'backbone': './Scripts/backbone.js'
},
transform: ['node-underscorify']
}
},
test: {
files: {
"dist/bundledApp.js": [
'./Scripts/jquery-2.1.4.js',
'./Scripts/underscore.js',
'./Scripts/backbone.js',
'./App/App.js',
'./App/**/*.js'
]
},
options: {
alias: {
'jquery': './Scripts/jquery-2.1.4.js',
'underscore': './Scripts/underscore.js',
'backbone': './Scripts/backbone.js'
},
transform: ['node-underscorify']
}
}
},
less: {
debug: {
options: { …Run Code Online (Sandbox Code Playgroud) 在尝试在生产中构建一个ember应用程序时,我已经有两个星期的错误了.在开发环境中构建它工作正常.我还意识到在ember-cli-build中禁用minifyJs会阻止错误,但是然后,应用程序在浏览器中加载时会停滞不前,而在控制台中,我看到另一个错误:"无法导入ember-resolver".
我的猜测是,这是因为UglifyWriter不了解某些代码.
完整的错误是:
构建失败.文件:assets/vendor.js(95443:4)Broccoli插件:[UglifyWriter]失败:新JS_Parse_Error错误(eval at(/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1 :1),:1545:18)
at js_error (eval at <anonymous> (/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1:1), <anonymous>:1553:11)
at croak (eval at <anonymous> (/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1:1), <anonymous>:2092:9)
at token_error (eval at <anonymous> (/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1:1), <anonymous>:2100:9)
at unexpected (eval at <anonymous> (/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1:1), <anonymous>:2106:9)
at semicolon (eval at <anonymous> (/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1:1), <anonymous>:2126:56)
at simple_statement (eval at <anonymous> (/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1:1), <anonymous>:2317:73)
at eval (eval at <anonymous> (/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1:1), <anonymous>:2186:19)
at eval (eval at <anonymous> (/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1:1), <anonymous>:2139:24)
at block_ (eval at <anonymous> (/home/larisoft/frontend/node_modules/uglify-js/tools/node.js:1:1), <anonymous>:2432:20)
Run Code Online (Sandbox Code Playgroud)
西兰花插件在以下地址实例化:UglifyWriter.Plugin(/home/larisoft/frontend/node_modules/broccoli-plugin/index.js:7:31)
at new UglifyWriter (/home/larisoft/frontend/node_modules/broccoli-uglify-sourcemap/index.js:25:10)
at UglifyWriter (/home/larisoft/frontend/node_modules/broccoli-uglify-sourcemap/index.js:20:12)
at Class.postprocessTree (/home/larisoft/frontend/node_modules/ember-cli-uglify/index.js:15:50) …Run Code Online (Sandbox Code Playgroud) 我console.log()在开发应用程序时使用了很多语句(我的意思是LOTS)。在没有Create React App 的情况下"ejecting",
我究竟如何才能删除它们
我考虑过但不确定如何实现:
在我的 package.json 中:
"build": "react-scripts build && uglifyjs --compress drop_console build/static/js/main.xxxxx.js -o build/static/js/main.xxxxx.js
Run Code Online (Sandbox Code Playgroud)
但是,我究竟如何知道文件的hash后缀,main.js以便我可以调用此命令并使用相同的文件名保存输出 js 文件
例如,我有以下代码:
if ("a" !== "a") {
console.log('really?');
}
var a = 5;
Run Code Online (Sandbox Code Playgroud)
然后我写uglifyjs code.js -o code.min.js.结果,我有以下几点:
if("a"!=="a"){console.log("really?")}var a=5;
Run Code Online (Sandbox Code Playgroud)
如何在if语句中启用删除死代码?
我的生产webpack配置是:
{
output: {
publicPath: "https://cdn.example.com/sub-directory/",
filename: '[name]-[chunkhash].min.js'
},
devtool: 'source-map',
plugins: [
new webpack.optimize.UglifyJsPlugin()
]
}
Run Code Online (Sandbox Code Playgroud)
现在我有两个文件app-12345.min.js和app-12345.min.js.map.
我也https://cdn.example.com/sub-directory/app-12345.min.js为主脚本自动生成了CDN URL .
但sourceMappingURL仍然是相对路径//# sourceMappingURL=app-12345.min.js.map,不能直接在浏览器中访问.
我的问题是我如何设置sourceMappingURL为绝对自动生成的路径?
我已经完成了一个项目,现在是时候构建它了.我正在使用样板项目,但仍然无法完全理解所有npm/webpack内容.运行"npm start"时,我收到错误:
ERROR in bundle.js from UglifyJs
SyntaxError: Unexpected token: punc ()) [bundle.js:848,29]
Run Code Online (Sandbox Code Playgroud)
在这个问题上搜索互联网一个小时后,我仍然无法解决它.根据我的理解,这个问题正在发生,因为Uglify还不喜欢ES2016.但是,我在互联网上找到的解决方案似乎没有起作用或者没有足够的意义让我实施.
我发现了这个stackoverflow问题,并将项目的package.json文件中的webpack行更改为:
"webpack": "fulls1z3/webpack#v2.1.0-beta.27-harmony"
Run Code Online (Sandbox Code Playgroud)
但这没效果.目前我还不能理解分支webpack的另一个建议.
我也尝试在我的src文件夹上运行babel另一个建议,但似乎没有做任何事情或我错误地运行它.
有没有人对这个问题有一个很好的解决方案?我现在非常困难,没有时间从头开始学习npm/webpack,以完全掌握正在发生的事情.
非常感激!
我正在为我的项目使用Angular-CLI(ng-cli).当我输入时ng serve,应用程序运行.但是,当我输入时ng serve --prod,我收到以下错误.
ERROR in vendor.bundle.js from UglifyJs SyntaxError: Unexpected token: name (IdUtil) [./~/my-lib/dist/src/common/util.js:7,0][vendor.bundle.js:9318,6]
此外,这些SO帖子(此处和此处)建议更改tsconfig.json为目标es5.我不清楚的是它们是指tsconfig.json消费的Angular项目还是用于生成库的项目.无论如何,我的Angular项目tsconfig.json已经成为目标es5.它看起来如下.
{
"compilerOptions": {
"declaration": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["es6", "dom"],
"mapRoot": "./",
"module": "es6",
"moduleResolution": "node",
"outDir": "../dist/out-tsc",
"sourceMap": true,
"target": "es5",
"typeRoots": [
"../node_modules/@types"
]
}
}
Run Code Online (Sandbox Code Playgroud)
在tsconfig.json已导入的角度项目库的样子以下和没有目标es5,但es6.顺便说一句,我不能简单地将这个库中的开关从es6后面翻转到es5 …
我写了一个blokus使用ES6语法的npm包.
我曾经create-react-app开始一个项目web-blokus,这取决于blokus.
我可以毫无错误地运行npm start,并web-blokus在我的浏览器中查看我的应用程序,它具有使用该blokus软件包的所有功能.
问题是我在运行时遇到了UglifyJS错误npm build.
static/js/main.8afd34e2.js from UglifyJs
SyntaxError: Name expected [./~/blokus/blokus/blokus.js:3,0]
Run Code Online (Sandbox Code Playgroud)
似乎有一种已知的情况,UglifyJS不支持ES6依赖(这里和这里有一些相关的问题线程).但是我通读了这些主题以及其他一些主题,我对于计划更新的内容和人们正在做的工作方式感到非常困惑.
所以我想
1)如果你的应用程序有任何ES6依赖项,create-react-app请确认无法开箱即用(一旦你去npm build)
2)询问人们正在做什么来修复/绕过问题(我是否必须弹出,并为UglifyJS换掉一些东西?)
既然create-react-appES6现在如此受欢迎,我认为我要么误解了这个限制,要么讨论并知道处理这个限制的标准方法.
building for production...[ Error: static/js/0.e5262afb6d92aae69c76.js from UglifyJs
`warnings` is not a supported option
at Function.buildError (/mypath/node_modules/_uglifyjs-webpack-plugin@2.0.1@uglifyjs-webpack-plugin/dist/index.js:114:12)
at results.forEach (/mypath/node_modules/_uglifyjs-webpack-plugin@2.0.1@uglifyjs-webpack-plugin/dist/index.js:255:52)
at Array.forEach (<anonymous>)
at taskRunner.run (/mypath/node_modules/_uglifyjs-webpack-plugin@2.0.1@uglifyjs-webpack-plugin/dist/index.js:242:17)
at step (/mypath/node_modules/_uglifyjs-webpack-plugin@2.0.1@uglifyjs-webpack-plugin/dist/TaskRunner.js:76:9)
at done (/mypath/node_modules/_uglifyjs-webpack-plugin@2.0.1@uglifyjs-webpack-plugin/dist/TaskRunner.js:84:30)
at boundWorkers (/mypath/node_modules/_uglifyjs-webpack-plugin@2.0.1@uglifyjs-webpack-plugin/dist/TaskRunner.js:89:13)
at /mypath/node_modules/_worker-farm@1.7.0@worker-farm/lib/farm.js:199:19
at process._tickCallback (internal/process/next_tick.js:61:11),
Error: static/js/1.89c4c336d047e363641c.js from UglifyJs
Run Code Online (Sandbox Code Playgroud)
当出现此错误npm run build的今天,
一切都4天前正确。
今天,当我更新本地的node_modules时,它就发生了。
我认为应该是某包前几天发布的新版本
任何帮助,将不胜感激!
更新
此错误是由上一版本uglify-js@3.5.10引起的,warnings在选项中删除可暂时修复此错误。
uglifyOptions: {
compress: {
warnings: false,
pure_funcs: ['console.log']
}
}
Run Code Online (Sandbox Code Playgroud) uglifyjs ×10
javascript ×6
webpack ×3
gruntjs ×2
source-maps ×2
angular ×1
angular-cli ×1
babeljs ×1
browserify ×1
cdn ×1
ecmascript-6 ×1
ember-cli ×1
ember.js ×1
node.js ×1
npm ×1
reactjs ×1