博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在项目中自定义路径放入element-ui并修改编译源码
阅读量:5815 次
发布时间:2019-06-18

本文共 4925 字,大约阅读时间需要 16 分钟。

起因

因为准备看element-ui的源码,会做一些笔记,在源码中写一些注释,甚至对源码进行一些自定义的修改来查看运行效果。

所以element-ui的文件夹不能直接npm install放在node_modules文件夹下面,node_modules文件夹一般是不同步到svn上的,放在里面的话在另一个电脑上可能重新安装项目自己的修改就没有了。
对引入的外部组件,如果要自定义修改,那么都不能放在node_modules下。
过程中遇到的一些问题记录一下。

element-ui贡献指南:

vue脚手架安装

vue init webpack element-learn

cd element-learn

npm install

npm run dev

一步步来,建好初始的文件夹。

引入element-ui

下载一个master分支。在src文件夹下建立一个element-ui文件夹,将下载的分支解压到该文件夹下。

此时尝试在main.js中引入element-ui:

import elementUI from './element-ui';
Vue.use(elementUI);

报错:This relative module was not found:

./element-ui in ./src/main.js

这是因为我们直接下载过来的element-ui没有经过编译。

模块机制从element-ui包的package.json中的读到的入口文件不存在。所以首先要自己编译element-ui源代码。

到element-ui中的操作

cd E:\vue\element-learn\src\element-ui

npm install

npm run dev

然后访问

可以看到示例。
跟官网
基本是一样的。我们也可以直接到这个示例中去修改组件,查看效果。毕竟实时编译。

然后是编译,也就是生成我们项目中会使用到的文件。

npm run dist

有可能会报错package.json does not exist, have you run lerna init?

npm install lerna一下。
有时候还会有些别的错误,把node_modules删除了重新npm install就好。

编译完之后我们就看到多了一个lib文件夹。里面就是编译生成的文件。

然后

cd E:\vue\element-learn

npm run dev

报这个:

[BABEL] Note: The code generator has deoptimised the styling of "E:/vue/element-learn/src/element-ui/lib/element-ui.common.js" as it exceeds the max of "500KB".
不过不用管它,这个不影响。
后面还有报错

* element-ui/lib/button in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/button-group in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/checkbox in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/checkbox-group in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/input in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/input-number in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/locale in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/mixins/emitter in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/mixins/locale in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/mixins/migrating in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/option in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/progress in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/scrollbar in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/select in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/tag in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/tooltip in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/transitions/collapse-transition in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/clickoutside in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/date in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/dom in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/merge in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/popup in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/resize-event in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/scroll-into-view in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/scrollbar-width in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/shared in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/util in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/vdom in ./src/element-ui/lib/element-ui.common.js* element-ui/lib/utils/vue-popper in ./src/element-ui/lib/element-ui.common.js复制代码

说明两点:1.element-ui的入口文件找到了。2.入口文件中路径配置可能有问题。

路径问题分析

首先我们到入口文件lib/element-ui.common.js,

发现里面有很多类似这样的模块引入:module.exports = require("element-ui/lib/select");
这个路径比较奇怪的是element-ui这一段是哪里来的,它怎么就知道我的目录是叫这个名字。于是我修改了目录名重新编译,发现这个文件里的路径还是这样。

然后我把名字改回来,把文件夹移动到node_moudule下,import elementUI from 'element-ui';

发现能正常运行。所以编译的包应该是没有问题的。问题在路径上。

然后文件夹移回去,到element-ui的build文件夹搜索一下element-ui。果然发现了不少element-ui。

关键在config.js中这里

exports.alias = {  main: path.resolve(__dirname, '../src'),  packages: path.resolve(__dirname, '../packages'),  examples: path.resolve(__dirname, '../examples'),  'element-ui': path.resolve(__dirname, '../')};复制代码

可以看到element-ui是这个路径的别名。所以element-ui这里的webpack是可以识别它的。而我们项目的的webpack是识别不了它的。

那么放到node_modules文件夹下,为什么可以正常识别这个路径呢,根据nodejs的模块搜索机制,npm install下来的它的文件夹名字也是element-ui,这个时候element-ui不是一个别名。直接引入node_modules中的模块,引入方式是import elementUI from 'element-ui',那么lib/element-ui.common.js文件中的那些'element-ui'就直接对应到element-ui的根目录了。

所以在我们项目的webpack配置webpack.base.conf.js中增加别名配置element-ui,把'element-ui'指向我们项目中element-ui根目录的位置src/element-ui:

    alias: {
      'vue$': 'vue/dist/vue.esm.js',       '@': resolve('src'),       'element-ui':resolve('src')+'/element-ui'     }复制代码

然后重新运行 npm run dev。运行成功。

于是我们的webpack也能正常地识别lib文件夹里文件中'element-ui'的路径了。

结尾

然后如果我们修改了element-ui的源码,只要编译一下就可以正常在我们自己的项目中应用了。

不过还有一点不好的地方就是我们没有对element-ui源码进行实时的编译,我们项目引用的是它编译过后的而不是真正的源代码,也就是没有把它自己的实时编译过程写到我们的项目webpack的配置中来。所以我们项目中npm run dev的时候并不能实时监测到我们对element-ui源码的修改。这一点后面再优化。

对于一些常见项目的脚手架,其实应该好好学习一下。以后再遇到文件路径问题,各种配置问题会得心应手很多。

记录一下,顺便推荐最近看的两本书《深入浅出nodejs》《深入理解es6》。

最先发在github上:

转载地址:http://bvxbx.baihongyu.com/

你可能感兴趣的文章
asp.net怎样在URL中使用中文、空格、特殊字符
查看>>
ASA5585-S20测试方案
查看>>
路由器发布服务器
查看>>
实现跨交换机VLAN间的通信
查看>>
jquery中的data-icon和data-role
查看>>
常见概率分布及python实现
查看>>
Java中的访问权限
查看>>
MySQL索引底层实现
查看>>
Excel 2010 如何将筛选后的数据复制粘贴到另一个工作表筛选后的表格里
查看>>
python例子
查看>>
环境变量(总结)
查看>>
PHP垃圾回收机制
查看>>
linux socket网络编程 线程池实现客服端程序
查看>>
thinkphp5中的一些关于命名空间的tisp
查看>>
[NIO-3]Socket通道
查看>>
ios之UILabel
查看>>
第6章-装饰模式
查看>>
CSRF与XSS攻击的原理与防范
查看>>
Java基础之String,StringBuilder,StringBuffer
查看>>
狼图腾读后感
查看>>