出处 https://www.cnblogs.com/daysme/

- 2018-01-06

昨晚找了一个代码解决了我对配置的需求。
高兴的拿到手机上测试却发现点击没有效果,电脑上是可以的呀,电脑上的手机模式是可以的呀。

难道是这代码不兼容手机?可能吧,再找找其他代码,把关键词下的都看完了,没有其他可用的。

在手机上搞个 console ,看到是由于手机上显示 tool is not definedtool 是这个工具的构造函数。难道是转换后的 js 手机版浏览器不支持?可能吧。那么到底是什么代码不支持呢?
看了生成后的文件,应该是最后一步 tool 没有被导出。
入口文件源码是这样的:

  import tool from './tool';
module.exports = tool;

下面的文章,都是自己编译、修改源码导致的报销,在浏览器上也不能运行,先是 tool is not defined, 后是 exports is not defined

应该是手机不支持转换后的模块加载方式。然后我打算把他的代码放到我之前的项目里去转换。你问我为什么不使用他自己的项目转码?我也想,因为他项目好像不是在 windows 开发的,并且使用了一些非 windows 平台的命令,如 rm 、 mkdir ,我换成 windows 上的 rd 和 md 及对应的语法格式,或删除这些不支持的命令去手动操作,都没有用,而且他的项目里几乎都是使用全局安装的工具转换, node-sass 、 babel … 。他执行命令时是通过一条命令把这些命令串连起来的,有些工具全局安装后不知道如何使用,最后就抛弃了这种方式。

当然,我使用自己的项目去转换他的代码,也并没有成功,报错还是相同的。

尝试把他的代码合并在一起以去除模块依赖,然后代码并不能运行。我想如果我对es6了解再熟悉一点的话之条路应该可能走通。但我知道这是一条不归之路,可不能为了运行代码,把前沿的东西都给改落后了,对不起作者,自己也没面子。

尝试使用在线的 babel 和 require.js 来直接加载未来编译过的 js ,不知道是不是自己的使用方式不对,报错还是一样。

还是继续看源码,再百度,发现好像作者使用的是 module.exports ,网上说这是 CommonJS 规范(四个关键字, module, exports, require, global),一般用在 node 里比较多, 浏览器是不能运行的。 AMD 规范使用的是 require([module], callback); 形式。 require.js 使用的是 AMD 规范,他能在浏览器里运行。那么难道是因为作者写的是 CommonJS ,我却用 require.js 去加载,才导致的报错?然后就开始搜索解决 CommonJS 和 AMD 规范之前问题的方法,结果没有成功,不知道如何使用。

后来想不到其他办法了,决定沉下心来,看看能不能改写作者的源码。我想的只是反正都是规范搞的鬼,那模块化规范也就那几句,也一共才导入三四个文件,应该能手动改成之前项目里自己写过的那种可以编译在浏览器里运行的模块化方式。随便看了一下 package.json ,发现好像别一个名字有点可疑 babel-preset-env ,自己以前的项目里没有遇到过,看起来像是某种转换方式。百度了一下,发现是用来转换不同环境的代码的,比如仅在 node ,仅在 chrome ,而不是把所有代码通通转为 es5 ,因为现在大部分浏览器都支持很多 es6 语法了,没必要全部转换,也的确作者的 package.json 里并没有 babel-preset-es2015 。 想着为什么作者的示例不能在手机上运行,或许就是故意使用了特定的转换方式,可是手机浏览器不如电脑更新快,支持度不高导致报错。

遂赶快安装了 babel-preset-es2015 , 运行 browserify -s tool -e ./src/index.js -o ./dist/tool.js -t [ babelify --presets [env] ] 试试。行一下,官网上的例子 不是 browserify a.js -o b.js 吗这里多了个 -s 是什么鬼?去官网看了下大概是什么 UMD 规范,之前的搜索 CommonJS 和 AMD 时有记得 UMD 是为了兼容这两个的规范的。把 -s 去掉 browserify ./src/index.js -o ./dist/configui.js -t [ babelify --presets [env] ] , 果然作者的代码编译出来也不能在电脑上用了,还是报了 tool is not defined 这个错,加上 -s 就好了, 使用 [es2015] 手机能运行了。

原来, 作者本就使用了兼容 CommonJS 和 AMD 的兼容规范 UMD, exports is not defined 这个坑是我自己挖出来的。走了这么多弯路, get 到 browserify 有个 -s 参数可以用来做模块化兼容,有个 babel 插件 babel-preset-env 可以用来转换为指定环境代码。

一个 xxx is not defined 引发的爬坑之路的更多相关文章

  1. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  2. Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求

    Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...

  3. Vue 爬坑之路(九)—— 用正确的姿势封装组件

    迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...

  4. Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli vue ...

  5. Vue 爬坑之路(十二)—— vue-cli 3.x 搭建项目

    Vue Cli 3 官方文档:https://cli.vuejs.org/zh/guide/ 一.安装 @vue/cli 更新到 3.x 之后,vue-cli 的包名从 vue-cli 改成了 @vu ...

  6. Tinker爬坑之路

    目的 热修复去年年底出的时候,变成了今年最火的技术之一.依旧记得去年面试的时候统一的MVP,然而今年却变成了RN,热修复.这不得不导致我们需要随时掌握最新的技术.不然可能随时会被淘汰.记得刚进公司,技 ...

  7. 安卓易学,爬坑不易——腾讯老司机的RecyclerView局部刷新爬坑之路

    针对手游的性能优化,腾讯WeTest平台的Cube工具提供了基本所有相关指标的检测,为手游进行最高效和准确的测试服务,不断改善玩家的体验.目前功能还在免费开放中. 点击地址:http://wetest ...

  8. Android爬坑之路

    做了那么久前端,现在终于可以回到我的老本行, 今天我用了一天的时间配置里Android开发环境,mac和windows双平台,eclipse和IDEA双平台,别问为什么,我就喜欢,中间大坑不断,再加上 ...

  9. 安卓易学,爬坑不易—腾讯老司机的RecyclerView局部刷新爬坑之路

    前言 安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人.下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程. 话说有图有真 ...

随机推荐

  1. wrapper class (Integer 为例)

    1,导入 Integer a = 100; Integer b = 100; Integer c = 150; Integer d = 150; a == b; true c == d; false ...

  2. (Review cs231n) The Gradient Calculation of Neural Network

    前言:牵扯到较多的数学问题 原始的评分函数: 两层神经网络,经过一个激活函数: 如图所示,中间隐藏层的个数的各数为超参数: 和SVM,一个单独的线性分类器需要处理不同朝向的汽车,但是它并不能处理不同颜 ...

  3. linux内核的双链表list_head、散列表hlist_head

    一.双链表list_head 1.基本概念 linux内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...

  4. QT -- plan

     QT  --  跨平台的 C++ 图形用户界面  应用程序框架 GUI介绍框架项目文件  .pro第一个QT (hello QT)父窗口 和 子窗口的区别(控件,部件,构件)信号 和 槽(信号的处理 ...

  5. 使用tableau去将存入mysql都地区点击率进行了展示 感觉很好用

    1.连接数据源很多选项:hive mysql Oracle 等所有数据库 2.写上hive2的那个客户端连接,下边会显示出让我装连接的驱动 ,所有jdbc都需要这样 点进去找到windows的下载一键 ...

  6. vue 实现modal

    本文只是作为练习弹出框,弹框内部的东西需要进行自定义添加,主要对更新,删除,新建 ,提示四种弹框进行实现,例子中只是简单的组件应用 Modal.vue文件 <template> <d ...

  7. 关于Android Camera2 API 的自动对焦的坑

    https://www.jianshu.com/p/280e5301b7b9 一.使用.关于Camera2的API使用,参考Google官方的例子: Camera2Basic Camera2Raw C ...

  8. linux中权限对文件和目录的意义

    1.权限对文件的意义: 读:可查看文件的内容 写:可修改文件的内容(但不能删除文件) 执行:可执行文件 2.权限对目录的意义: 读:可以查看目录下的内容,即可以读取该目录下的结构列表 写:可修改目录下 ...

  9. TCP编程:系统出现 TIME_WAIT 原因及解决办法

    解决办法 打开 sysctl.conf 文件,修改以下几个参数: net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_ti ...

  10. intel webrtc 部署

    org link conference server Configure the MCU server 1. set the maximum numbers of open files, runnin ...