参考:[前端工具链课(二)—— 模块化工具及组件化思想](http://www.toutiao.com/a6357876639150096642/)
[做了一夜动画,让大家十分钟搞懂 Webpack](https://mp.weixin.qq.com/s/i6_fIcLDeDFmvZJj8NYrVg)
**entry.js**
```javascript
var foo = require('./foo.js');
// require('./style.css');
console.log(foo.bar);
```
**foo.js**
```javascript
module.exports = { bar: 5555 }
```
**webpack.config.js**
```javascript
module.exports = {
entry: './entry.js', // 入口文件
output: {
path: './build',
filename: 'output.js' // 输出文件路径及文件名
},
module: {
loaders: [
{ test: /\.css$/, loader: 'style!css' } // `!` 是管道,loader 会从后往前依次执行
]
}
}
```
**执行**
```shell
webpack
```
**生成 ./build/output.js**
```
(function(modules) { // webpackBootstrap
// The module cache
var installedModules = {};
// The require function
function __webpack_require__(moduleId) {
// Check if module is in cache
if(installedModules[moduleId])
return installedModules[moduleId].exports;
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
exports: {},
id: moduleId,
loaded: false
};
// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
// Flag the module as loaded
module.loaded = true;
// Return the exports of the module
return module.exports;
}
// expose the modules object (__webpack_modules__)
__webpack_require__.m = modules;
// expose the module cache
__webpack_require__.c = installedModules;
// __webpack_public_path__
__webpack_require__.p = "";
// Load entry module and return exports
return __webpack_require__(0);
})
/************************************************************************/
([
/* 0 */
function(module, exports, __webpack_require__) {
var foo = __webpack_require__(1);
// require('./style.css');
console.log(foo.bar);
},
/* 1 */
function(module, exports) {
module.exports = { bar: 5555 }
}
]);
```
在控制台执行`output.js`,输出了`5555`。
* * * * *
以上是一个最简单,最基本的由 `webpack` 将 `node CommonJS` 代码转化为浏览器端执行代码的过程。
### 下面来分析
首先我们应该首先注意到,上面代码
~~~
/************************************************************************/
~~~
将两段代码分割开了,实际上是这样的结构:
~~~
(function(){})()
~~~
所以这就是一个匿名函数的自调用结构了。
……有时间详细分析吧,其实很简单……
参考:
- [如何理解和熟练运用js中的call及apply?](https://www.zhihu.com/question/20289071)
- [javascript里function之前加上感叹号 ' ! ' 会怎么样?](https://segmentfault.com/q/1010000000117476)
- [function与感叹号](https://swordair.com/function-and-exclamation-mark/)
* * * * *
### 其他
~~~javascript
(function(globalObj){
if(typeof module === 'object' && typeof module.exports === 'object'){
module.exports = globalObj;
}else{
if(window.salt){
window.salt['router'] = globalObj;
}else{
window.salt = {
router:globalObj
}
}
}
})(Salt_router)
~~~
>[danger] 注意这段js代码可以在浏览器环境和`NodeJS`环境中运行哦。(node环境下webpack打包时会导出模块,而在浏览器上运行时,会暴露出全局变量)
### 扩展
html head里面的加载器:
~~~html
<head>
……
<!-- head里面的"加载器"还不能获取到head对象,但可以获取到script,利用这个特性也能实现加载(如果是head之后的,那么可以使用document.head) -->
<script>
var PUBLIC_URL = 'http://niceui.cn/public';
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "//hm.baidu.com/hm.js?cb41502e6f72ba22487a33d4a5d7f9df";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
……
</head>
~~~
update:2017-3-7 13:49:55
- 开始
- 微信小程序
- 获取用户信息
- 记录
- HTML
- HTML5
- 文档根节点
- 你真的了解script标签吗?
- 文档结构
- 已经落后的技术
- form表单
- html实体
- CSS
- css优先级 & 设计模式
- 如何编写高效的 CSS 选择符
- 笔记
- 小计
- flex布局
- 细节体验
- Flex
- Grid
- tailwindcss
- JavaScript
- javascript物语
- js函数定义
- js中的数组对象
- js的json解析
- js中数组的操作
- js事件冒泡
- js中的判断
- js语句声明会提前
- cookie操作
- 关于javascript你要知道的
- 关于innerHTML的试验
- js引擎与GUI引擎是互斥的
- 如何安全的修改对象
- 当渲染引擎遇上强迫症
- 不要使用连相等
- 修改数组-对象
- 算法-函数
- 事件探析
- 事件循环
- js事件循环中的上下文和作用域的经典问题
- Promise
- 最佳实践
- 页面遮罩加载效果
- 网站静态文件之思考
- 图片加载问题
- 路由及转场解决方案
- web app
- 写一个页面路由转场的管理工具
- 谈编程
- 技术/思想的斗争
- 前端技术选型分析
- 我想放点html模板代码
- 开发自适应网页
- 后台前端项目的开发
- 网站PC版和移动版的模板方案
- 前后端分离
- 淘宝前后端分离
- 前后端分离的思考与实践(一)
- 前后端分离的思考与实践(二)
- 前后端分离的思考与实践(三)
- 前后端分离的思考与实践(四)
- 前后端分离的思考与实践(五)
- 前后端分离的思考与实践(六)
- 动画
- 开发小技巧
- Axios
- 屏幕适配
- 理论基础
- 思考
- flexible.js原理
- 实验
- rem的坑,为什么要设置成百分比,为什么又是62.5%
- 为什么以一个标准适配的,其它宽度也能同等适配
- 自适应、响应式、弹性布局、屏幕适配
- 适配:都用百分比?
- 番外篇
- 给你看看0.5px长什么样?
- 用事实证明viewport scale缩放不会改变rem元素的大小
- 为什么PC端页面缩放不会影响rem元素
- 究竟以哪个为设备独立像素
- PC到移动端初试
- 深入理解px
- 响应式之栅格系统
- 深入理解px(二)
- 一篇搞定移动端适配
- flex版栅格布局
- 其他
- 浏览器加载初探
- 警惕你的开发工具
- JS模块化
- webpack
- 打包原理
- 异步加载
- gulp
- 命名规范
- 接口开发
- sea.js学习
- require.js学习
- react学习
- react笔记
- vue学习
- vue3
- 工具、技巧
- 临时笔记
- 怎么维护好开源项目
- 待办
- 对前端MVV*C框架的思考
- jquery问题
- 临时
- 好文
- 节流防抖