WEBPACK & BABEL 打包项目
本文首发于 BriFuture's Blog。
最近在用 Vue 重写之前的一个项目 Compass,这个项目以前是用 QML + JavaScript 在 Qt 平台上搭建的。这是我本科毕设时做的一个项目,很有意思也学了很多东西(WebGL,QML 等等),但已经很久没有更新了。
旧项目的翻新
不更新的原因有几个:一是因为主要的功能都已经实现,程序长时间运行也不会出错;另外一点就是当时是用 QtCreator 作为 IDE 进行开发的,每次修改代码之后都需要重新编译项目,导致开发起来非常耗时。尽管 QtCreator 为 QML 和 JavaScript 作了很多优化,在程序运行过程中也可以进入 DEBUG SESSION 中查看变量,但是开发过程仍然很繁琐。
Compass 这个项目一直被丢在 Github 上,直到最近我学习了 Vue,我发现这个工具让 Web 开发变得异常简单,并且它支持 hot-reload(当然这个功能是由 webpack devserver 提供的)。于是我最近就尝试将之前的代码移植到 浏览器
中。之前的项目是 QML + JS 实现的,核心的功能都是由 JS 提供,移植过程比较轻松(现在大概完成了 50%)。我把 JS 代码更新到了 ES6 语法,并且按功能分放在了不同的模块,使用 babel 进行转译。
我的想法是在 Vue 中开发 JS 3D 程序,功能完备后通过 webpack 的打包功能将核心模块打包成一个 JS 文件(打包后就像在 Compass 项目中的 SpacePath.js
文件一样)。类似于将 Vue 当做开发环境,将 QML 环境当做生产环境。
移植过程的感受
Vue 项目的开发很简单,我都是通过 Vue-cli@3.x 完成的,它隐藏了很多细节,用起来很简单。说实话,我除了修改一些变量的引用和将之前的 SpacePath.js
文件拆分外没有做多少工作。然后这个新的程序就可以在浏览器中跑了起来,显示出我想要的东西。但是以前编写的 QML 代码没法直接拿来用,不过好在 QML 的代码不复杂,移植到 Vue 中应该不难。
当我觉得基本功能移植的差不多了,我开始想要将分散的各个 JS 文件编译到一个单独的文件中时,我发现 webpack (还有 babel)对于我这个新手来说很难,我的想法并不好实现。因为这些项目的版本迭代快,可能版本不对就会出现一些莫名其妙的错误。而且最要命的是,尽管在打包过程中 webpack(babel)给出了错误提示,但我在 Google 上面仍然找不到和我碰到的是一样的问题,找到的解决方法不尽相同,但帮助甚少。
这里记录下我的打包过程,很有可能对你没有什么帮助,不过或许会给你一些提示,然后你就能自己动手解决这个问题了。
声明:我并不了解 Webpack 和 Babel 的工作原理,仅仅是通过自己的尝试找到了解决问题的方法。这个方法的解决思路(哦好像没有思路,就是不断的尝试和 Google)并不一定是对的,但它对我来说确实是有用的。
Webpack 打包
首先在 package.json 中添加一条自定义的命令:
{
...
"scripts" : {
...
"bcompass": "webpack --config compass.config.js"
}
}
compass.config.js
是在项目根目录下的一个 webpack 配置文件,最终的文件内容如下:
var path = require('path');
module.exports = {
entry: "./src/compass/SpacePath.js",
// chainWebpack: config => {
// config.module.rules.delete('eslint');
// },
mode: 'production',
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
options:{
presets:["@babel/preset-env"]
},
exclude:[/node_modules/, /assets/],
},
]
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'spacepath.js'
},
optimization: {
minimize: false
}
}
babel 配置文件 .babelrc
:
{
"presets": [
[
"@babel/preset-env",
{
// "useBuiltIns": "entry"
"targets": {
"browsers": ["last 2 versions", {"modules": false}]
}
}
]
],
"plugins": ["transform-class-properties"]
}
运行 yarn bcompass
就会执行打包操作。配置的 Babel 环境是 "@babel/preset-env": "^7.4.2"
。
在打包过程中出现了类变量定义的问题(语法问题):
根据错误提示,安装 babel-plugin-transform-class-properties
插件,并且在 .babelrc 中添加这个插件。
另外一个问题是打包过程中无法找到资源文件:
我的解决方法很简单,将 @
换成 ..
相对路径,解决了找不到资源文件的问题。在使用 Vue 构建项目时没有这个问题,应该是 Vue 配置了 @
的别名,但我的 compass.config.js
中没有配置,所以出现问题。
最后打包后的 spacepath.js
可以直接在 html 界面中引用:
<body>
<div id=app>
<canvas id="canvas" width="800" height="600"></canvas>
</div>
<script src=/static/gl-matrix-min.js></script>
<script src=/static/webgl-obj-loader.min.js> </script>
<script src=/static/spacepath.js> </script>
</body>
找到 canvas 的 document 对象,传给 SpacePath 的构造函数,在 canvas 中就画出 3D 场景了。
写在后面
移植过程还没有全部完成,全部完成后就可以实现在 Web 浏览器中做到之前的 QQuick 项目的效果。
虽然我编写了 WebGL code 实现了 3D 场景的绘制,如果想了解 WebGL 中一些底层原理的话,就推荐自己动手实现一遍,但如果你想要快速的进行 WebGL 开发的话,我更推荐你去使用 Three.js。
WEBPACK & BABEL 打包项目的更多相关文章
- 0基础手把手教你搭建webpack运行打包项目(未完待续)
这些天在项目之余的时间学习了webpack打包项目的东西,非常荣幸的找到一些大神的文章来学习,死劲嚼了几天,终于略知一二.在以后的工作上还需继续学习,下面我将分享我这几天学到的一点东西,希望能让我一个 ...
- Webpack:打包项目报错(eslint: debugger)
打包项目需要把项目中的debugger删除,否则会报错.
- webpack+babel项目在IE下报Promise未定义错误引出的思考
低版本浏览器引起的问题 最近开发一个基于webpack+babel+react的项目,一般本地是在chrome浏览上面开发,chrome浏览器开发因为支持大部分新的js特性,所以一般不怎么需要poly ...
- Webpack 2 视频教程 017 - Webpack 2 中分离打包项目代码与组件代码
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- 基于Vue + webpack + Vue-cli 实现分环境打包项目
需求由来:我公司项目上线发布至服务器分为三个环境分别为测试环境.预发布环境.生产环境:前期做法是项目通过脚步打包时由脚步把域名和后缀名之类的全部替换成要发布的环境所需要的,因为我公司的项目比较大由许许 ...
- 如何使用webpack打包项目
webpack是前端开发中比较常用的打包工具之一,另外还有gulp,grunt.之前没有涉及过打包这块,这里介绍一下使用webpack打包的流程. Grunt和Gulp的工作方式是:在一个配置文件中, ...
- vue+webpack多个项目共用组件动态打包单个项目
原文复制:https://www.jianshu.com/p/fa19a07b1496 修改了一些东西,因为sh脚本不能再window电脑执行,所以改成了node脚本.这是基于vue-cli2.0配置 ...
- 【vue】饿了么项目-使用webpack打包项目
1.vue cli给我们提供了npm run build命令打包项目,在packa.json文件中scripts对象中有build属性,当我们执行npm run build时,就执行build对应的& ...
- webpack进阶构建项目(一)
webpack进阶构建项目(一) 阅读目录 1.理解webpack加载器 2.html-webpack-plugin学习 3.压缩js与css 4.理解less-loader加载器的使用 5.理解ba ...
随机推荐
- Consul ACL
consul自带ACL控制功能,看了很多遍官方文档,没有配置步骤https://www.consul.io/docs/internals/acl.html 主要对各种配置参数解释,没有明确的步骤,当时 ...
- SDOI2013直径(树的直径)
题目描述: 点这里 题目大意: 就是在一个树上找其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. 题解: 首先,第一问很好求,两边dfs就行了,第一次从任一点找距它最远的点,再从这个点找距 ...
- HTTP响应状态码参考
HTTP响应状态码参考: 1xx:信息 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求. Switching Protocols 服务器转换协议 ...
- Spring整合JPA时,为实体类添加@Entity注解时提示The type MultipartEntity is deprecated
这个情况是由于导入错了Entity包所导致的. 按住Alt+T时,会有两个关于@Entity的提示 org.hibernate.annotations.Entity 和 javax.persisten ...
- 4.iptables 网络防火墙
[1] #如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文. [2] #使用如下命令查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启 c ...
- “全栈2019”Java第二十五章:流程控制语句中循环语句while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- luoguP2479 [SDOI2010]捉迷藏
https://www.luogu.org/problemnew/show/P2479 据说可以用线段树做但是我不会,只能写一个 KD-Tree 了 对于每个点求出距离它最远的点和最近的点的距离,然后 ...
- Centos6和7的区别
1.init系统 Linux 操作系统的启动首先从 BIOS 开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化.内核初始化的最后一步就是启动 pid 为 1 ...
- [Flex] 组件Tree系列 —— 实现右键拓展功能
主程序mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:结合tree拓展右键功能 必 ...
- C++11 template parameter deduction
C++11 引入了右值引用的概念,由此在引出 an rvalue reference to a cv-unqualified template parameter. 在template functio ...