背景:

项目基于原生js,没用到任何脚手架和框架,但也需要打包压缩。

项目的js中声明了一些全局变量 供其他js调用。

这时候如果用webpack打包,基于webpack特性,会嵌套一层大函数,会将js中的变量变成局部,不能供其他js调用。

因此弃用了webpack。选用了uglifyjs。

原因:

webpack里也有用到uglifyjs的webpack版:uglifyjs-webpack-plugin。

打包途径:

打包源文件:dev文件夹下的js文件====>目标文件:js文件夹。

目录结构

使用:

1、如果是es5 使用uglify-js 官网的默认分支就是这个。

2、如果是es6 使用uglify-es 官网的harmony分支 下载下来就是uglify-es。

uglifyjs官网:https://github.com/mishoo/UglifyJS2

步骤:

首先确认自己电脑有没有安装node,这是用node启动的。

1、下载uglifyjs 这里我下载的是es版。

npm install uglify-es -D

2、写一个package.json,下面的package.json可以下载下来 直接npm i 就省略了第一步了。

scripts里面是我写的命令

我想在development下打包后也能调试 用到了sourceMap(映射),

在production下打包压缩。

我的入口文件 起名了entry.js

{
"name": "ocplayermin",
"version": "1.0.0",
"description": "ocplayer min version",
"main": "entry.js",
"scripts": {
"build_min": "NODE_ENV=production node entry.js --progress",
"build_min_dev": "NODE_ENV=development node entry.js --progress"
},
"keywords": [],
"author": "",
"license": "MIT",
"dependencies": {},
"devDependencies": {
"uglify-es": "^3.3.9",
"uglify-js": "^3.7.4"
}
}

 

注意:NODE_ENV在windows下不兼容 需要安装cross-env插件:npm install cross-env --save-dev

安装完 在 build_min 和 build_min_dev后加上 cross-env 就可以。

3、entry.js代码

打算把dev文件下的js文件打包到js文件中。

代码逻辑:

  • 1、遍历dev文件夹下的所有js文件,获取到文件名和旧路径。
  • 2、生成js文件夹,如果没有js文件夹 则创建,生成新文件的路径。
  • 3、development下 用UglifyJS.minify压缩生成sourceMap文件。
  • 4、production下 由于development环境下生成了.js.map文件,这里删除.js.map,生成.js文件。

遇到的问题:

由于在浏览器读取时,映射 source map读取的文件需要和js是同一个目录 因此需要将前端的端口路径,赋值到.js.map。

例如:地址:127.0.0.1:5500/minversion/index.html;

推荐一款好用的编辑器(用vcode编辑器的open with live server启动项目,默认端口5500)

读取前端js路径:127.0.0.1:5500/minversion/js/xxx.js;

映射生成的路径也得是127.0.0.1:5500/minversion/js/xxx.js.map;如果是'./js/xxx.js.map'是读取不到的。

我新建了一个config.json 专门存取常量,我将前端的端口写在这里 声明为:PLUGIN_URL只要修改这个,entry.js就能读取到。

对source map 不太知道的 可以看官网文档。

config.json

{"pluginUrl":"http://127.0.0.1:5500/minversion"}

entry.js

const path = require('path');
const fs=require('fs'); const UglifyJS = require("uglify-es");//兼容es6
//var UglifyJS = require("uglify-js");//es5
const ORIGIN_PATH='/dev';
const ORIGIN_DIR = '.'+ORIGIN_PATH; // 原目录
const DESTINATION_PATH='/js';
const DESTINATION_DIR = '.'+DESTINATION_PATH;//打包后的目录
var PLUGIN_URL="";/*地址*/
PLUGIN_URL=JSON.parse(fs.readFileSync('./config.json','utf-8')).pluginUrl; // 遍历目录得到文件信息
function getPath(_path, callback) {
let files = fs.readdirSync(_path);
files.forEach(function(file){
//判断文件是否存在
if (fs.statSync(_path + '/' + file).isFile()) {
callback(_path, file);
}
});
}
//生成压缩后的文件
function buildMin (callback) {
/*如果不存在min 就会创建min文件夹*/
if ( !fs.existsSync(DESTINATION_DIR) ) {
fs.mkdirSync(DESTINATION_DIR);
}
// 运行
getPath(ORIGIN_DIR, function (_path, file) {
let fileName = file.match(/(\S+)(\.\S+)$/)[1]; // 获得文件名 let oldPath = _path + '/' + file, // 原路径
newPath = DESTINATION_PATH + '/' + fileName+'.js'; // 新路径 到不了.js const _code = fs.readFileSync(oldPath, 'utf-8');
callback(newPath,fileName,_code) });
}
//删除文件
function deleteFile(delPath, direct) {
delPath = direct ? delPath : path.join(__dirname, delPath)
try {
/**
* @des 判断文件或文件夹是否存在
*/
if (fs.existsSync(delPath)) {
fs.unlinkSync(delPath);
} else {
console.log('inexistence path:', delPath);
}
} catch (error) {
console.log('del error', error);
}
} if (process.env.NODE_ENV === 'production') {
/*生产环境*/
getPath(DESTINATION_DIR, function (_path, file) {
//删除.map文件
if(file.indexOf('.js.map')>-1){
let delp = _path+'/'+file;
deleteFile(delp)
}
})
  //打包
buildMin(function(newPath,fileName,_code){
const minCode = UglifyJS.minify(_code,{
compress:{pure_funcs:'console.log'}
}).code;
fs.writeFileSync('.'+newPath, minCode);
}); } if (process.env.NODE_ENV === 'development') {
/*开发环境*/
  //打包
buildMin(function(newPath,fileName,_code){
var _codeFname = "."+newPath;
var _code_file={};
_code_file[_codeFname]=_code;
const _minObj = UglifyJS.minify(_code_file,{
sourceMap: {
filename:fileName+'.js',
url:PLUGIN_URL+newPath+".map",//生成的就是127.0.0.1:5500/minversion/js/xxx.js.map
includeSources:PLUGIN_URL+newPath+".map",
},
keep_fnames:true,
warnings: true,
});
fs.writeFileSync('.'+newPath, _minObj.code);
fs.writeFileSync('.'+newPath+'.map', _minObj.map);
});
}

  

  至此就打包成功啦,可以复制到自己项目中试一下。记得将源文件夹、目标文件夹改成你的项目路径,还有PLUGIN_URL。

webpack打包后不能调用,改用uglifyjs打包压缩的更多相关文章

  1. 将node-webkit打包后文件用nsis再打包成安装包

  2. (16/24) webpack打包后的调试方法

    在程序开发中,调试程序是最频繁的,那使用了webpack后,所有的代码都打包到了一起,这给调试带来了困难,但是webpack在设计时就已经考虑好了这点,它支持生产Source Maps来方便我们的调试 ...

  3. 【笔记】vue-cli 打包后路径问题出错的解决方法

    几天之前打包自己的vue 项目上传到远程服务器上面 但是遇到了如下几个问题: 1. 线上浏览页面时是空白页面 2. 打包后资源文件(js, css 文件)引用的路径不正确 3. 开发环境中使用到的如: ...

  4. Vue打包后出现一些map文件

    Vue打包后出现一些map文件的解决办法: 问题: 可能很多人在做vue项目打包,打包之后js中,会自动生成一些map文件,那我们怎么把它去掉不要呢? 1,运行  cnpm run build  开始 ...

  5. vue打包后出现的.map文件

    run dev build 打包项目后出现的list中的".map"文件最大. “.map”文件的作用:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得 ...

  6. vue打包后出现一些map文件的解决方法

    Vue打包后出现一些map文件的解决办法: 问题: 可能很多人在做vue项目打包,打包之后js中,会自动生成一些map文件,那我们怎么把它去掉不要呢? 1.运行  cnpm run build  开始 ...

  7. 【转】android Apk打包过程概述_android是如何打包apk的

    最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程.   流程概述: 1.打包资源文件,生成 ...

  8. android Apk打包过程概述_android是如何打包apk的

    流程概述:1.打包资源文件,生成R.java文件2.处理aidl文件,生成相应java 文件3.编译工程源代码,生成相应class 文件4.转换所有class文件,生成classes.dex文件5.打 ...

  9. 简要分析webpack打包后代码

    开门见山 1.打包单一模块 webpack.config.js module.exports = { entry:"./chunk1.js", output: { path: __ ...

随机推荐

  1. [Python]random生成随机6位验证码

    #!/usr/bin/env pyhton # coding:utf-8 # @Time : 2020-02-16 10:07 # @Author : LeoShi # @Site : # @File ...

  2. python3安装pycrypto

    这几天想用py3弄一个系统,需要用到WeChat-sdk这个包,在pip install wechat-sdk的时候报了一系列的错误,最后定位是安装pycrypto出错,各种度娘之后说要安装vs201 ...

  3. Leetcode面试题17.20_连续中值

    题目地址 实现一个数列的动态添加和查询中位数. 复杂点的话应该可以写个平衡树什么的,然后查询第k大,还可以删除数字. 简单点的话显然可以维护两个堆,一个大顶堆一个小顶堆,而且大顶堆最多比小顶堆多一个, ...

  4. NIO学习笔记,从Linux IO演化模型到Netty—— 究竟如何理解同步、异步、阻塞、非阻塞

    我的观点 首先,分开各自理解. 1. 同步:描述两个(或者多个)个体之间的协调关系. 比如,单线程中,methodA调用了methodB,methodB返回后,methodA才往下执行,那么称A同步调 ...

  5. 部署LAMP环境搭建一个网站论坛平台

    修改主机名 Hostname openstack-001 Hostname Login 修改本地域名解析 Vi /etc/hosts 最后一行添加 192.168.1.56 openstack-001 ...

  6. js—求数组中的最大最小值

    参考链接:https://www.w3cplus.com/javascript/calculate-the-max-min-value-from-an-array.html Math.min.appl ...

  7. 「Flink」配置使用Flink调试WebUI

    很多时候,我们在IDE中编写Flink代码,我们希望能够查看到Web UI,从而来了解Flink程序的运行情况.按照以下步骤操作即可,亲测有效. 1.添加Maven依赖 <dependency& ...

  8. 证明task线程是来源于线程池的,线程重用

    1.线程池是单例的,全局唯一的,设置线程池最大活跃线程数是5,设置后,允许同时并发的Task只有5个,我们开启100个task去做任务,从最后的输出结果看到,虽然开启了100个task,但是线程id始 ...

  9. .net core 开发 Windows Forms 程序

    我是一名 ASP.NET 程序员,专注于 B/S 项目开发.累计文章阅读量超过一千万,我的博客主页地址:https://www.itsvse.com/blog_xzz.html 引言 .net cor ...

  10. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...