首页 > Web开发 > 详细

webpack学习

时间:2019-05-28 23:20:46      阅读:153      评论:0      收藏:0      [点我收藏+]

学习webpack 4.0      https://webpack.docschina.org/concepts/

一个最简单的打包的代码。https://github.com/ronami/minipack

const graph = createGraph(‘./example/entry.js‘);
const result = bundle(graph);

console.log(result);
const fs = require(‘fs‘);
const path = require(‘path‘);
const babylon = require(‘babylon‘);
const traverse = require(‘babel-traverse‘).default;
const {transformFromAst} = require(‘babel-core‘);

let ID = 0;
function bundle(graph) {
  let modules = ‘‘;
  graph.forEach(mod => {
    modules += `${mod.id}: [
      function (require, module, exports) {
        ${mod.code}
      },
      ${JSON.stringify(mod.mapping)},
    ],`;
  });
  const result = `
    (function(modules) {
      function require(id) {
        const [fn, mapping] = modules[id];

        function localRequire(name) {
          return require(mapping[name]);
        }

        const module = { exports : {} };

        fn(localRequire, module, module.exports);

        return module.exports;
      }

      require(0);
    })({${modules}})
  `;

  // We simply return the result, hurray! :)
  return result;
}

function createGraph(entry) {
  // Start by parsing the entry file.
  const mainAsset = createAsset(entry);
  const queue = [mainAsset];
  for (const asset of queue) {
    asset.mapping = {};

    // This is the directory this module is in.
    const dirname = path.dirname(asset.filename);

    // We iterate over the list of relative paths to its dependencies.
    asset.dependencies.forEach(relativePath => {
      const absolutePath = path.join(dirname, relativePath);
      // Parse the asset, read its content, and extract its dependencies.
      const child = createAsset(absolutePath);
      asset.mapping[relativePath] = child.id;
      queue.push(child);
    });
  }
  return queue;
}
function createAsset(filename) {
// Read the content of the file as a string.
const content = fs.readFileSync(filename, ‘utf-8‘);
const ast = babylon.parse(content, {
sourceType: ‘module‘,
});
const dependencies = [];
traverse(ast, {
ImportDeclaration: ({node}) => {
dependencies.push(node.source.value);
},
});
const id = ID++;
const {code} = transformFromAst(ast, null, {
presets: [‘env‘],
});
return {
id,
filename,
dependencies,
code,
};
}

  

 #### webpack 原理文章

https://juejin.im/entry/5b0e3eba5188251534379615

https://juejin.im/post/5aa3d2056fb9a028c36868aa#heading-8

https://juejin.im/post/5b304f1f51882574c72f19b0#heading-0

https://juejin.im/post/5ac9dc9af265da23884d5543

webpack学习

原文:https://www.cnblogs.com/coding4/p/10940939.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!