webpack打包原理了解

打包工具系列之——webpack 打包原理及优化 啊啊啊 阅读详情

首先搭建webpack环境配置:
1.在package.json文件中创建
在这里插入图片描述
可以直接黑窗中使用testWebpack执行bin目录下的这个脚本
注: 需要在运行的脚本中声明node环境执行 #!/usr/bin/env node

//执行的脚本文件
/**
  1.获取打包的配置内容
  2.使用自己写的testWebpack分析依赖来打包
*/

  //src下创建js脚本 news.js index.js
  //news.js  导出一个对象属性
  module.exports = {
    name:'张三'
}

  //index.js  使用commentjs规范 导入news.js文件
  let news = require('./news');
  console.log(news.name);

  //testWeb.pack.js  模拟webpack中的entry 入口
  module.exports =  {
    entry:'./src/index.js',
  }
  

package.json执行的脚本
1.首先获取打包的配置文件
2.创建lib下compiler.js来执行打包,分析打包入口entry依赖

 //bin目录testWebpack.js
  //bin/testWebpack.js
  #!/usr/bin/env node
  //导入node path模块处理文件路径
const path = require('path');
// 读取需要打包的配置文件    获取配置文件的绝对路径
let webpack = require(path.resolve("testWeb.pack.js"))
//配置文件内容 模拟webpack中的entry
console.log(webpack)
// 通过面向对象的方式来进行项目推进
let compiler = require("../lib/compiler.js")
//实例化compiler执行打包依赖分析
new compiler(webpack).start()

lib下compiler.js。
webpack打包文件是通过{"./src/news.js“:webpack_require()}来执行
1.读取entry入口的文件,获取该入口文件的内容 使用node的fs模块来获取脚本内容fs.readFileSync(path, ‘utf-8’);
2.获取的入口文件包含require 浏览器无法解析需要将require替换成__webpack_require__
(此时需要使用到3个babel全家桶替换获取到的内容,1.使用@babel/parser将es6代码转换成ast抽象语法树。 2.使用@babel/traverse替换抽象语法树符合条件的内容。3.使用@babel/generator将对象语法树转换成源码)

//lib/compiler.js
const path = require('path');
const fs = require('fs');

// 将es6代码转换成ast抽象语法树
const paser = require('@babel/parser')

// 将ast抽象语法树替换内容    es6模块导出的需要点一下default
const traverse = require('@babel/traverse').default;

// 将ast转换成源码使用generator转换
const generator = require('@babel/generator').default;



class Compiler {
    constructor(config) {
        this.config = config;;
        this.entry = config.entry;
        //  获取执行指令的目录
        this.root = process.cwd();
    }

    getSource(path) {
        //读取当前路径下的文件 获取文件的代码
        return fs.readFileSync(path, 'utf-8');
    }

    depAnalyse(modlePath) {
        let result = this.getSource(modlePath)
        //    将代码转换成抽象语法树  对象
        let ast = paser.parse(result)
        // console.log(ast);
        // 使用traverse模块将ast抽象语法树找到的内容进行替换  修改ast
        traverse(ast, {
            CallExpression(p) {
                console.log(p.node.callee.name)
                if (p.node.callee.name == 'require') {
                    // 将代码中requre替换成__webpack_require__
                    p.node.callee.name = '__webpack_require__';

                    // 将./news.js 替换成./src/news.js
                    let value = p.node.arguments[0].value
                    value = "./" + (path.join("src", value));
                    //    多做一个处理将所有\\改成/
                    value.replace(/\\+/g, "/")
                    p.node.arguments[0].value = value
                    console.log(p.node.arguments[0].value)
                }
            }
        })
        // 获取替换后的代码
        let sourceCode = generator(ast).code;
        console.log(sourceCode)
    }

    start() {
        //开始打包了
        // 依赖分析
        this.depAnalyse(path.resolve(this.root, this.entry))
    }
}


module.exports = Compiler

此时已经分析完单个文件的依赖了,但一个入口文件可能会有多个依赖,需要对这些依赖递归获取内容处理,创建一个内部数组存储所有的文件依赖,遍历该数组将依赖一层一层递归下去修改依赖替换相应的代码

depAnalyse(modlePath) {
        let result = this.getSource(modlePath)
        //    将代码转换成抽象语法树  对象
        let ast = paser.parse(result)
        // console.log(ast);
        //存储所有的依赖
        let depArr =[]
        // 使用traverse模块将ast抽象语法树找到的内容进行替换  修改ast
        traverse(ast, {
            CallExpression(p) {
                console.log(p.node.callee.name)
                if (p.node.callee.name == 'require') {
                    // 将代码中requre替换成__webpack_require__
                    p.node.callee.name = '__webpack_require__';

                    // 将./news.js 替换成./src/news.js
                    let value = p.node.arguments[0].value
                    value = "./" + (path.join("src", value));
                    //    多做一个处理将所有\\改成/
                    value.replace(/\\+/g, "/")
                    p.node.arguments[0].value = value
                    console.log(p.node.arguments[0].value)
                    depArr.push(p.node.arguments[0].value)
                }
            }
        })
        // 获取替换后的代码
        let sourceCode = generator(ast).code;
        console.log(sourceCode)
        //遍历所有的依赖文件 递归处理所有依赖
        // 遍历该数组  将依赖一层一层递归获取内容替换相应代码
        depArr.forEach(dep => this.depAnalyse(path.resolve(this.root, dep)))
    }

所有依赖获取并修改内容后创建一个modules对象,存储所有源码 将所有依赖文件处理成{’./src/index.js’:’./src/index.js源码’}以此类推

  let result = this.getSource(modlePath)
        //    将代码转换成抽象语法树  对象
        let ast = paser.parse(result)
        // console.log(ast);
        // 用来存储所有获得的文件路径
        let depArr = []
        // 使用traverse模块将ast抽象语法树找到的内容进行替换  修改ast  CallExpression()钩子
        traverse(ast, {
            CallExpression(p) {
                console.log(p.node.callee.name)
                if (p.node.callee.name == 'require') {
                    // 将代码中requre替换成__webpack_require__
                    p.node.callee.name = '__webpack_require__';

                    // 将./news.js 替换成./src/news.js
                    let value = p.node.arguments[0].value
                    value = "./" + (path.join("src", value));
                    //    多做一个处理将所有\\改成/
                    value.replace(/\\+/g, "/")
                    p.node.arguments[0].value = value
                    // 每找到一个require调用,修改路径后将其存入依赖数组中 
                    depArr.push(p.node.arguments[0].value)
                }
            }
        })
        // 获取替换后的代码 将ast语法树转换成源码
        let sourceCode = generator(ast).code;

        // 获取相对路径  
        let newModulesPath = path.relative(this.root, modlePath)
        // 将获取到到路径手动拼接修改得到一个新的相对路径
        newModulesPath = "./"+newModulesPath.replace(/\\+/g, "/");
        //将所有模块存入modules中  {'./src/inde.js':'xxx代码'}
        this.modules[newModulesPath] = sourceCode;
        console.log(this.modules)

        // 遍历该数组  将依赖一层一层递归获取内容替换相应代码
        depArr.forEach(dep => this.depAnalyse(path.resolve(this.root, dep)))

此时打印的this.modules内容如下
在这里插入图片描述
使用模版拼接代码然后使用node fs模块读写到打包配置文件output出口目录下

//ejs文件
(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] = {
i: moduleId,
l: false,
exports: {}
};

// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

// Flag the module as loaded
module.l = true;

// Return the exports of the module
return module.exports;
}


// Load entry module and return exports
return __webpack_require__(__webpack_require__.s = "<%-entry%>");
})
({
<% for (let k in modules) { %>

"<%-k%>": (function (module, exports, __webpack_require__) {
eval(`<%-modules[k]%>`);
}),
<% } %>
});

// 将文件输出
    outputFile() {
        // 读取写好的模版字符串
        let template = this.getSource(path.resolve(__dirname, "../template/output.ejs"));

        //读取模版
        let result = ejs.render(template, {
            entry: this.entry,
            modules: this.modules
        })

        console.log(result)
        //   拼接打包配置文件的路径获取输出文件的路径
        let outputFilePath = path.join(this.config.output.path, this.config.output.filename);
        //使用fs模块写出内容到配置输出目录下
        fs.writeFileSync(outputFilePath, result)
    }

    start() {
        //开始打包了
        // 依赖分析
        this.depAnalyse(path.resolve(this.root, this.entry))

        // 依赖分析完后 将文件输出
        this.outputFile()

    }

打印的模版内容如下
在这里插入图片描述
此时已经完成基本的打包步骤了,浏览器正常解析运行
在这里插入图片描述
总结:ps纯属练习不好莫怪

/**
 * webpack打包原理     将所有依赖文件处理成{'./src/index.js':'./src/index.js源码'}
 * 1.创建配置文件
 * 2.创建执行脚本 package.json中配置 bin/**.js文件
 * 3.运行脚本中获取配置文件配置
 * 4.创建打包分析依赖脚本Compiler  1.获取配置文件的入口路径 2.使用node中fs模块读取该配置文件的内容,因webpack无法解析require 需要将内容的require修改成__webpack_require__字段,将路径修改成./src/index.js 使用babel全家桶 @babel/parser将获取到的入口文件内容转换成ast语法树  使用@babel/traverse修改ast语法树匹配的内容,使用@babel/generator将ast语法树转换成源码
 * 5.一个入口文件可能会有多个依赖,需要对这些依赖递归获取内容处理。创建一个内部数组存储所有的文件依赖,遍历该数组将依赖一层一层递归下去修改依赖替换相应的代码
 * 6.创建modules对象 存储所有源码 将所有依赖文件处理成{'./src/index.js':'./src/index.js源码'}以此类推 
 * 7.将打包js使用模版生成字符串 写出到打包配置中到出口也就是dist/bundels.js中
 */
webpack打包原理入门探究(七)模板处理 webpack打包原理入门探究(六)less|sass-loader初探 webpack打包原理入门探究(五)css-loader初探 webpack打包原理入门探究(五)loader初探(二) webpack打包原理入门探究(五)loader初探(一) webpack打包原理入门探究(四)插件探究(下) webpack打包原理入门探究(四)插件探究(上) webpack打包原理入门探究(三)入口探究 webpack打包原理入门探究(二)基本配置 webpack打包原理入门探究(一) 起初为什么会想要学习. 阅读详情

相关推荐

双向晶闸管交流调压基础知识及Multisim电路仿真

本文介绍了双向晶闸管交流调压电路的工作原理及应用。该电路由双向晶闸管、RC移相电路和双向触发二极管组成,通过调节电位器改变触发角实现电压调节。当电位器阻值减小时,触发角减小,输出电压升高;阻值增大时,触发角增大,输出电压降低。Multisim仿真展示了不同电位器档位下的波形特征:0%档位时全导通,50%档位时半导通,100%档位时基本关断。该电路结构简单、调节平滑,广泛应用于调光、调速等场合,但会产生谐波干扰。

XU157303764的博客 837

webpack系列 —— 打包原理

为什么要使用webpack? 如今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包。为了简化开发的复杂度,前端社区涌现出了很多好的实践方法: 模块化,让我们可以把复杂的程序细化为小的文件; 类似于TypeScript这种在JavaScript基础上拓展的开发语言:使我们能够实现目前版本的JavaScript不能直接使用的特性,并且之后还能能装换为JavaScript文件使浏览器可以识别; scss,less等CSS预处理器 ......... 这

七月 1万+

SAP采购含税价转换的底层逻辑解析:ABAP例程如何实现价税分离计算

本文深入解析SAP系统中采购含税价与不含税价的转换机制,重点介绍VOFM例程和ABAP代码实现价税分离计算的方法。通过详细讲解数学原理、税率体系及SAP定价引擎架构,为开发人员提供完整的解决方案,帮助提升采购业务中的价格处理效率和准确性。

weixin_29237635的博客 450

webpack打包原理

1. webpack核心概念 entry: 一个可执行模块或库的入口文件。 chunk :多个文件组成的一个代码块,例如把一个可执行模块和它所有依赖的模块组合和一个 chunk 这体现了webpack的打包机制。 loader :文件转换器,例如把es6转换为es5,scss转换为css。 plugin :插件,用于扩展webpack的功能,在webpack构建生命周期的节点上加入扩展hook为webpack加入功能。 2. webpack构建流程 从启动webpack构建到输出结果经历了一系列过程,它

weixin_43845044的博客 4434

Figma入门-自动布局

Figma原型图制作内置组件友好,自动布局类似CSS flex,通过布局网格控制对齐、分布、换行等,前端熟悉的同学易上手,参数设置基本一致。

我码玄黄的博客 2173

无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架

Solon 是新一代,Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目(最近“杭州六小龙”很火啊,我们也是杭州的哦)。从零开始构建(No Spring、No Java-EE、No Servlet),有灵活的接口规范与开放生态。采用对商用友好的 Apache 2.0 开源协议。

向往自由的少年!(我是一个少年!!!) 1692

Vue基础知识总结 9:vue webpack打包原理

???? Java学习路线:搬砖工逆袭Java架构师 ???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 一、前端模块化 webpack是让我们可以进行模块化开发,并且会帮助我们处理模块间的依赖关系。 并且不仅仅是JavaScript文件,还有CSS、图片、json文件等等,在webpack中都可以被当做模块来使用。 二、打

学Java,找哪吒 2万+

华为OD机考2025C卷 - 高矮个子排队(Java & Python& JS & C++ & C)

华为OD机考2025C卷 - 高矮个子排队。提供在线OJ刷题。Java、C++、Python、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1680

webpack打包原理_简单了解webpack热更新原理

webpack热更新Hot Module Replacement应该所有人都知道,现象就是你修改代码保存之后,浏览器不会刷新,只会修改你更改过的依赖代码。我们平时用webpack-dev-server如果没有配置,是直接刷新浏览器,并不是热更新。之前遇见几次问webpack热更新原理,我只是知道和怎么使用,也没真的去了解一下,这次了解了一下,发现没有对webpack深层次研究,根本不懂,...

weixin_39606003的博客 144

ISMN数据处理

可批量下载,十分方便

m0_46268055的博客 1214

YOLO-V8训练自己的数据集之标注样本

四、标注样本 4.1、标注样本概述 4.1.1、样本标注主要方法 4.1.2、标注样本概念 4.1.3、标注样本实现方式 4.1.4、常见标注样本软件 4.2、标注工具LabelImg 4.2.1、LabelImg介绍 4.2.2、LabelImg特点 4.2.3、LabelImg安装方法 4.2.4、LabelImg使用方法 4.3、标注样本实操 4.3.1、安装标注软件Labelimg 4.3.2、Labelimg界面介绍 4.3.3、LabelImg实操过程中常

qq_29633789的博客 662

webpack打包缓存_深入了解 webpack 模块加载原理

webpack 是一个模块打包器,在它看来,每一个文件都是一个模块。无论你开发使用的是 CommonJS 规范还是 ES6 模块规范,打包后的文件都统一使用 webpack 自定义的模块规范来管理、加载模块。本文将从一个简单的示例开始,来讲解 webpack 模块加载原理。CommonJS 规范假设现在有如下两个文件:// index.js const test2 = require('./tes...

weixin_34151005的博客 461

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

yohnyang的博客 208

实现一个简单的webpack,了解打包原理

实现一个简单的webpack,了解webpack的打包原理

weixin_51670675的博客 630

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

手写一个简易bundler打包工具带你了解Webpack原理

用原生js手写一个简易的打包工具bundler序言一、模块分析(入口文件代码分析)1. 项目结构2. 安装第三方依赖3. 业务代码4. 开始打包二、依赖图谱Dependencies Graph1. 结果分析2. 分析所有模块的依赖关系三、生成代码1. 逻辑编写2. 结果分析四、结束语彩蛋 One More Thing(:往期推荐(:番外篇 序言 我们都知道, webpack 是一个打包工具。在我们对它进行配置之前,它也是经过一系列的代码编写,才生成的打

moandaylab 338

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

webpack打包流程解析以及手撸简易webpack

webpack打包的流程实际上是根据文件间的依赖关系对其进行静态分析,然后将这些模块按指定规则生成静态资源,webpack会将这些关系整理成一个依赖关系图(dependency graph),整理完成后再根据整个依赖关系图来生成文件,所以我们可以大致的将整个打包流程分为4步 根据入口文件,分析依赖 逐级分析,确定用到的所有模块 将这些模块以及他们之间的关系生成一个依赖关系图 依据这个依赖关系图生成文件 为了完成这几个步骤,我们需要 一个帮助我们分析单个模块的module analyzer的函数 一个帮

weixin_47232046的博客 588

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

element ui框架(webpack打包器)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在前端开发中一般会用到webpack打包器。虽然使用npm run build会自动调用webpack帮助我们打包,不过还是建议大家可以手动编写代码,看一下打包的过程究竟是怎么样的。 1、安装webpack、webpack-cli

嵌入式-老费,一个分享专业嵌入式知识的blog 1090

webpack打包vue反编译_webpack打包原理入门探究(八)总结

子由风:webpack打包原理入门探究(七)其他文件处理​zhuanlan.zhihu.com起初为什么会想要学习 webpack 打包原理,只是因为好奇心发作,由于在工作中,我有处理过项目的首屏加载速度优化的过程,虽然但是是解决了加载问题,也对那些 loader 甚是一脸懵逼,于是上周五下定决心要研究一下 webpack 原理,研究了 vue 几个常见的 组件,创建了一个 kui 组件库李金文/...

weixin_39888080的博客 1251

什么是Webpack?它的主要功能是什么?

什么是Webpack?它的主要功能是什么?

商务合作欢迎私信我 5963

webpack 打包过程 学习

通过 程柳峰 老师的 视屏学习 webpack,这里记录一下 关于 webpack 的学习笔记 1、npm run build 发生了什么 会 从 node_module/.bin 中查找 webpack.cmd 查找 webpack-cli 或者 webpack-commond 是否安装 没有的话,就会 提示进行安装,如果安装了 一个,则正常运行,如果 装了两个,提示删掉一个 分...

dongcehao的博客 448

export default 打包_一个简易打包工具, 探索webpack打包原理

Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载,通过loader的转换,任何形式的资源都可以视作模块,比如CommonJs模块、 AMD模块、 ES6模块、CSS、图片、JSON、Coffee和LESS等。webpack的用法, 我想是不用我在啰嗦了, ...

weixin_39708854的博客 146

webpack面试题总结

本文主要是对webpack面试会常被问到的问题做一些总结,且文章会不断持续更新 1.webpack打包原理 把所有依赖打包成一个 bundle.js 文件,通过代码分割成单元片段并按需加载。 2.webpack的优势 (1)webpack 是以 commonJS 的形式来书写脚本滴,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。 (2)能被模块化的不仅仅是 JS 了。 ...

素味平生的博客 1万+

从入门到掌握Webpack(一)

从这一期开始我打算和大家一起学习Webpack. 下面的是关于学习Webpack的目录 认识webpack webpack的安装 webpack的起步 (webpack的helloWord) webpack的配置 loader的使用 webpack中配置Vue plugin的使用搭建本地服务器 webpack是什么? webpack在官网的解释:本质上来讲, webpack是一个现代的Javascript应用的静态模块打包工具。 这里包含两个关键词:模块和打包。也是webpack两...

weixin_44550157的博客 448

20k以上面试必问,Webpack原理和优化

我身边很多朋友都觉得 Webpack 不重要,认为只要团队里有人会就可以,而那个人不需要是自己。那么我就给你一个必须学它的理由:Webpack 原理和优化工资20k以上的面试必问如果你...

zz_jesse的博客 171
上一篇: 使用vue-cli编写第一个vue小插件
下一篇: mpvue使用axios发送请求
want、
博客等级 码龄7年 10粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值