资讯专栏INFORMATION COLUMN

npm + webpack + es6 初体验

seasonley / 678人阅读

摘要:当然,我们需要先下载配置下载和配置下载下载的加载器下载完了,要去进行配置,配置完的文件如下可以看到,和之前的相比,增加了一个的配置。

准备

下载Node.js和npm

一个命令行工具(我的是git bash)。不是必须的,用自带的命令行也可以。

创建一个文件夹,作为根目录,比如 npm-webpack-es6

这时,你将看到一个空文件夹

开始

命令行打开至根目录

键入 npm init,一路确定到yes ————————创建一个package.json。

文件夹如左

package.json 内部如左

安装webpack

安装webpack前,先附上几个常用的npm命令

npm init      这个指令会引导你创建一个package.json,包括版本作者等信息,有助于你发包。后面安装的包的依赖关系也会在package.json里有体现。
npm install     直接执行这个命令,会按照当前目录下的package.json的配置去安装各个依赖的包。
npm install [module]    在当前目录安装这个模块。会去检测该模块是否存在于node_module文件夹中,存在了就不安装了。 
npm install [module] -g    在全局进行模块安装。全局模式下安装的包,会自动注册到系统变量 path里的。
npm install [module] --save-dev    在当前目录下安装这个模块,但是仅在开发时使用。在package的"devDependencies"下,表示仅在开发的时候使用。

有一些包是需要用命令行的,这些需要注册系统变量,因此像supervisor等包,一定要安装在全局。否则就不能用它的命令行指令。
有一些包是在js中使用的,那么这些包安装到当前目录就可以了。
webpack 一般建议全局安一个,当前目录安一个。

我们刚才已经使用了npm init创建了一个package.json,接下来我们开始安装webpack。

首先在全局安装一个webpack

执行 npm install webpack -g         (已经全局安装webpack 的可以跳过这一步)

然后在当前目录下安装一个webpack

执行 npm install webpack --save

你会发现当前目录下新增了一个文件夹node_module,在里头有着webpack的包

检验下,webpack 安装成功了没

执行  webpack -v

如果webpack安装成功了,就会在命令行打印出webpack的版本和帮助。
如果失败了,检测一下有没有在全局安装webpack。

当你执行到这步,你的文件夹长这个样子

   --npm-webpack-es6
        --package.json
        --node_module
            --webpack

package.json长这个样子

{
  "name": "npm-webpack-es6",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^1.13.2"
  }
}
使用webpack来组织文件

在直接介绍使用es6模块化语言来组织文件之前,我们先了解一下webpack的使用。
webpack会将我们用模块化语言语法写成的源文件,编译成浏览器可识别的文件。也就是有从源文件→线上文件的过程。

我们来实践一下:

首先在根目录下创建一个文件夹src来放源文件;

再创建一个文件夹dist来放编译后文件;

新建一个html文件来放html文件

最后创建一个webpack.config.js。 (先创个空的,待会儿加内容)

这时你的目录结构将如下:

webpack.config.js是webpack的配置文件。
要搞懂webpack其实就是要懂得怎么来配置 webpack.config.js。
本文介绍一个基础的配置,完整的配置教程请参照官网文档——webpack官网文档。

接下来:

在src中新建一个文件—— sourceFile.js

文件内容,随意点:

//sourceFile.js
console.log("我是superman");

配置 webpack.config.js (关键一步)

module.exports = {
    entry:{
        bundle : __dirname + "/src/sourceFile.js" 
    },
    output:{
        path: __dirname + "/dist",
        filename: "[name].js"
    }
}

这个文件仅有entry和output,应该是最简单的配置文件了。

module.exports 是CommonJS的写法,这个是Node.js的规范

__dirname 代表当前目录,Node.js会去识别

entry中,值为一个路径,代表源文件的存放位置。键,则可以随便取,在我的配置中,编译后文件的名字就是这里的键。

output中,path为编译后的文件存放的文件夹。 filename 为编译后文件夹名字。 其中[name]代表了entry中的键。也就是说上面是什么名字,编译后就是什么名字。可以自己试验下。

使用webpack进行编译

在命令行键入 webpack -w            

成功编译的话,命令行的显示

同时在dist中会新出现一个 bundle.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) {

    console.log("我是superman");

/***/ }
/******/ ]);

可以看到编译后的js多了很多额外的内容,所以如果项目小的话是不需要模块化的。模块化是用来构建中大型项目的。

来看看效果

在html文件夹下新建一个 test.html




    
    看看我们编译后的js可不可以用


    

在浏览器打开test.html,你会看到浏览器的console中:

说明我们将源文件sourceFile.js编译后生成的bundle.js,是可以正常使用的。

疑惑

 这样子做的话,和html中直接引用源文件效果是一样的啊。话说为什么要编译啊?这样不是更麻烦吗?

这是我刚接触webpack的感受。后来,我逐步理解了,编译其实是为了实现模块化。基于AMD/CMD/CommonJS/es6的语法,浏览器是无法识别的。这些规范的语法,你可以感受一下:

 //AMD
require(["moduleA", "moduleB", "moduleC"], function (moduleA, moduleB, moduleC)
{
    alert("加载成功");
});

//CMD
seajs.use("../static/hello/src/main")

//CommonJS
module.export = {
    name:"rouwan"
}

//es6模块
import {module1, module2} form "./module.js";

这些规范使用的语法,浏览器是不能识别的。不信你试一下,立马报错。除非未来几年,浏览器支持es2015的import和export。因此,需要由webpack来编译,编译后的文件,浏览器能够识别。

现在,我们开始使用es6模块语法来组织模块吧

使用es6模块语法

webpack可以支持es6语法。这个也是为什么webpack强大的原因。用es6a ,想想就爽。
当然,我们需要先下载配置babel

下载和配置babel
下载babel:

npm install --save-dev babel-loader babel-core babel-preset-es2015  //下载babel的webpack加载器

下载完了,要去webpack.config.js进行配置,配置完的文件如下:

module.exports = {
    entry:{
        bundle : __dirname + "/src/sourceFile.js"
    },
    output:{
        path: __dirname + "/dist",
        filename: "[name].js"
    },
    module:{
        loaders:[{
            test: /.js$/,
            loader: "babel?presets=es2015"
        }]
    }
}

可以看到,和之前的webpack.config.js相比,增加了一个loaders的配置。
大致意思是:所有的js文件,使用babel加载器来翻译一下
具体配置原理可查官网文档 loader的api

怎么看自己是否配置好呢?待会儿webpack编译时看有没有报错,浏览器端有没有识别es6语法就知道了。

开始使用es6模块
在src文件夹下新建一个文件——moduleTest.js

//moduleTest.js
function say(){
    console.log("我引用了一个模块")
}

export {say}

将sourceFile.js的内容改为:

//sourceFile.js
import {say} from "./moduleTest.js";
say();

在命令行运行webpack编译指令

webpack -w

如果没有报错,先开心一下。嘿嘿。
别急,先去打开test.html看看,如果你看到了命令行成功打印

那么,恭喜你,这个demo完整地跑完了。

结语

前端工程化是大势所趋,我们将不再人工去实现 依赖管理,代码压缩混淆,测试,上线等开发流程,转而交由工具去完成。这些工具中,npm作为优秀的包管理工具,节省了我们在搜索各个库的官网下载库的时间,方便我们进行包的下载,更新,和依赖管理;webpack作为优秀的模块化构建工具,支持多种模块化规范,并能将css/字体/图片作为模块管理,编译各类js方言,有着丰富的插件,已经超出了一个模块加载器的范围,成为了一款强大的前端构建工具。

本文仅仅介绍了一个最简单的demo,因为我也正在学习中。详细的资料,还是要去看文档并实践,这里给出几个传送门以便大家详细了解npm/webpack/es6模块的知识。

npm常用指令
webpack官方文档
阮一峰的ECMA6入门——es6模块

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80431.html

相关文章

  • webpack+react项目体验——记录我的webpack环境配置

    摘要:安装写在里安装和配置和之前一样用来处理文件相关的这个包括的就比较多,有,后面两个是为了写和服务。 这两天学习了一些webpack的知识,loaders+plugins真的很强大!不过配置起来也很复杂,看了一些文章,自己也写了项目练手,写下来加深自己的印象。 首先,非常非常推荐的几篇文章,初学者一定要看!http://www.jianshu.com/p/42e1...(标题一点也不夸张,...

    csRyan 评论0 收藏0
  • flint简单体验

    摘要:它能够使得在不刷新浏览器的情况下,更改本地的前端代码组件,浏览器自动更新预览。直接集成了这项技术,而且建立了专门的通道进行错误的实时反馈。命令行提供了三个主要的命令,。服务器关于服务器,其实是内部起了一个基于的服务器,外加进行消息的通讯。 跟着初探了下flintjs,的确会很棒,超级热更新! 学习地址: http://frontenddev.org/link/ali-11-11-...

    Batkid 评论0 收藏0
  • webpack打包体验

    摘要:确保在和环境下,如果没有,先安装环境。我的新建一个文件夹,在命令行里进入执行此时,文件夹下多了一个文件。本文仅献给初学的同学,功能强大,想要学好仍需多多学习。 1、确保在node和npm环境下,如果没有,先安装node环境。我的node: showImg(https://segmentfault.com/img/bVbu1T2); 2、新建一个文件夹web,在命令行里进入web,执行 ...

    canopus4u 评论0 收藏0
  • 前端模块化——技术选型

    摘要:前言前端模块化,主要是解决两个问题命名空间冲突,文件依赖管理。目前解决的方法是模块化命名空间各个模块的命名空间独立。模块化构建工具,等是用来组织前端模块的构建工具加载器。 前言 前端模块化,主要是解决两个问题——命名空间冲突,文件依赖管理。 坑___命名空间冲突 我自己测试好的代码和大家合并后怎么起冲突了? 页面脚本的变量或函数覆盖了公有脚本的。 坑___文件依赖管理 明明项目需...

    Doyle 评论0 收藏0
  • webpack使用

    摘要:引用网上一作者的话将前端项目当成一项系统工程进行分析组织和构建从而达到项目结构清晰分工明确团队配合默契开发效率提高的目的。提示,是因为缺少这个文件。 前端工程化 在网页比较简单的时代,以文件可以包含 HTML、CSS、JS;到后来结构、样式、行为的分离,文件开始多起来,慢慢的出现了AMD,CMD ,CommonJS,ES6 Module等,技术变化日新月异,把这些技术统一整合起来,就是...

    habren 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<