webpack打包后不能调用,改用uglifyjs打包压缩

背景:

项目基于原生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。

原文地址:https://www.cnblogs.com/weichenzhiyi/p/12206809.html

时间: 2024-08-29 06:36:22

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

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

几天之前打包自己的vue 项目上传到远程服务器上面 但是遇到了如下几个问题: 1. 线上浏览页面时是空白页面 2. 打包后资源文件(js, css 文件)引用的路径不正确 3. 开发环境中使用到的如:组件内部css 的背景图路径,通过 computed 属性计算返回的图片路径不正确问题 于是在网上参考了两篇文章便逐一解决了: https://www.cnblogs.com/moqiutao/p/7496718.html http://blog.csdn.net/obkoro1/article/d

Vue打包后出现一些map文件

Vue打包后出现一些map文件的解决办法: 问题: 可能很多人在做vue项目打包,打包之后js中,会自动生成一些map文件,那我们怎么把它去掉不要呢? 1,运行  cnpm run build  开始打包 2,会在项目目录下自动创建dist目录,打包好的文件都在其中 解决办法:     去src/config/index.js中改一个参数: productionSourceMap:false 把这个改为false.不然在最终打包的文件中会出现一些map文件,map文件的作用在于:项目打包后,代码

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

最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程. 流程概述: 1.打包资源文件,生成R.java文件 2.处理aidl文件,生成相应java 文件 3.编译工程源代码,生成相应class 文件 4.转换所有class文件,生成classes.dex文件 5.打包生成apk 6.对apk文件进行签名 7.对签名后的apk文件进行对其处理 打包过程使用的工具 名称 功能介绍 在操作系统中的

简要分析webpack打包后代码

原文地址:https://www.jianshu.com/p/0e5247f9975f 1.打包单一模块 webpack.config.js module.exports = { entry:"./chunk1.js", output: { path: __dirname + '/dist', filename: '[name].js' }, }; chunk1.js var chunk1=1; exports.chunk1=chunk1; 打包后,main.js(webpack生成的

webpack打包后bundle.js文件过大的问题

由于webpack将所有的文件合并到一个js文件.因此打包后的文件过大,导致网络请求不畅. 今天尝试了一下webpack打包.结果打出来3.6M.因为之前在本地测试的原因,一直用的webpack -w的命令. 即监控入口文件有无改动,若有改动,则自动编译. 更改命令:webpack -p -w webpack -p起到压缩的作用. 结果为1.4M. 查阅了一下相关资料.果断用nginx进行gzip压缩. 进入 /usr/local/etc/nginx目录下 打开编辑nginx.conf 配置如下

webpack打包后访问不到json文件

一.问题描述 在vue中,前端写ajax假数据,用axios将json数据渲染到组件中,开发期间一切正常,webpack打包压缩后,json文件的路径错误,页面访问不到数据,导致渲染失败. 二.预期结果 能正常获取数据,渲染页面. 三.问题分析 因为webpack没有把json文件打包到dist目录,所以not found,即便加了json-loader也无用. 四.解决方案 手动把ajax数据目录拷贝到dist目录,先让页面完整出来.通常ajax数据是后端给前端一个接口地址,前端去访问的,所以

性能优化 - 查看 webpack 打包后所有的依赖关系(webpack 可视化工具)

查看 webpack 打包后所有组件与组件间的依赖关系,针对多余的包文件过大, 剔除首次影响加载的效率问题进行剔除修改,本次采用的是 ==webpack-bundle-analyzer(可视化视图查看器)== == 介绍1:webpack-bundle-analyzer(可视化)== 将捆绑内容表示为方便的交互式可缩放树形图 如下效果图: 模块功能: 意识到你的文件打包压缩后中真正的内容 找出哪些模块组成最大的大小 找到错误的模块 优化它! 最好的事情是它支持缩小捆绑!它解析它们以获得实际大小的

webpack: 简单分析 webpack 打包后的代码

编译后代码 /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module

webpack打包后iconfont文件路径问题解决

在使用vue-cli创建vue项目时,可以自动生成webpack文件.使用 npm run build 即可打包发布生产文件,打包后的文件 可以看到使用url-loader处理后的文件是在static目录下生成fonts目录下的文件.全部样式文件打包在css目录下app.hash.css文件中. 但我们会发现发布后,会存在字体文件找不到的问题,查看css文件发现是iconfont字体文件的路径引用问题. 解决方法: 在build/utils文件中的下图所示位置添加../../公共路径 这样打包的